当前位置: 首页 > 知识库问答 >
问题:

使用GSON创建JSON,并将冒号作为字段名称的一部分

冷翼
2023-03-14

我已经创建了一组需要转换成json的类(pojos)。因为json字段名必须符合某种格式,所以我选择了gson作为我的库,因为它允许对字段名进行注释。

因此,我有json字段名,如< code>asset_type、< code > preview _ image _ thumbnail 等。除此之外,任何元数据字段都必须具有格式< code>metadata:

因此,这归结为我的元数据:标签元数据:站点注释不会被gson转换,因为它们不是有效的json字段名称,至少根据gson。

所有工作都很好,除了那些该死的元数据字段名称。我的目标是有如下输出:

{
  "name": "Test Remote Asset",
  "description": "test-remote-asset",
  "asset_type": "remote_asset",
  "duration": 172360,
  "stream_urls": {
    "flash": "http://www.test-site.com/videos/a-video.flv",
    "iphone": "http://www.test-site.com/videos/a-video.3gp",
    "ipad": "http://www.test-site.com/videos/a-video.3gp",
    "source_file": "http://www.test-site.com/videos/a-video.mp4"
  },
  "metadata:tags": "tag1,tag2,tag3",
  "metadata:site": "test-site"
}

这是我在尝试将我的类转换为json时遇到的异常:

java.lang.IllegalArgumentException: metadata:tags is not a valid JSON field name.

这是我想要转换的类:

public class RemoteAsset {

/** The video's name **/
private String name;

/** The video's description **/
private String description;

/** The video asset type **/
@SerializedName("asset_type")
private String assetType;

/** The video's duration, in milliseconds **/
private long duration;

/** The video's thumbnail preview URL **/
@SerializedName("preview_image_url")
private String previewImageUrl;

/** The video's OpenCms Structure ID **/
@SerializedName("external_id")
private String externalId;

/** The video's various streaming URLs **/
@SerializedName("stream_urls")
private StreamUrls streamUrls;

/** The video's tags, coma-separated **/
@SerializedName("metadata:tags")
private String metadataTags;

/** The video's host site **/
@SerializedName("metadata:site")
private String metadataSite;

public String getMetadataTags() {
    return metadataTags;
}

public void setMetadataTags(String metadata_tags) {
    this.metadataTags = metadata_tags;
}

public String getMetadataSite() {
    return metadataSite;
}

public void setMetadataSite(String metadata_site) {
    this.metadataSite = metadata_site;
}

public RemoteAsset() {

    this.streamUrls = null;
    this.assetType = null;
    this.previewImageUrl = "";
    this.metadataSite = "";
    this.metadataTags = "";
    this.externalId = "";
    this.description = "";
    this.duration = 0L;
    this.name = "";
}

public String getName() {
    return this.name;
}

public void setName(String name) {
    this.name = name;
}

public String getDescription() {
    return this.description;
}

public void setDescription(String description) {
    this.description = description;
}

public String getAssetType() {
    return this.assetType;
}

public void setAssetType(ASSET_TYPE asset_type) {
    this.assetType = asset_type.getTypeName();
}

public long getDuration() {
    return this.duration;
}

public void setDuration(long duration) {
    this.duration = duration;
}

public String getPreviewImageUrl() {
    return this.previewImageUrl;
}

public void setPreviewImageUrl(String preview_image_url) {
    this.previewImageUrl = preview_image_url;
}

public String getExternalId() {
    return this.externalId;
}

public void setExternalId(String external_id) {
    this.externalId = external_id;
}

public StreamUrls getStreamUrls() {
    return this.streamUrls;
}

public void setStreamUrls(StreamUrls stream_urls) {
    this.streamUrls = stream_urls;
}

@Override
public String toString() {
    StringBuilder builder = new StringBuilder();
    builder.append("RemoteAsset [name=").append(this.name)
            .append(", description=").append(this.description)
            .append(", assetType=").append(this.assetType)
            .append(", duration=").append(this.duration)
            .append(", previewImageUrl=").append(this.previewImageUrl)
            .append(", externalId=").append(this.externalId)
            .append(", streamUrls=").append(this.streamUrls).append("]");
    return builder.toString();
}
}

共有1个答案

厉令
2023-03-14

问题是它们不能直接映射到Java变量,因为变量名中不能有冒号。您需要使用Gson < code > @ serialized name 批注。以下至少适用于Gson版本2.2.2:

public static void main( String[] args ) 
{
    String json = "{\"some:field\":\"foo\"}";
    Gson gson = new Gson();

    MyClass mc = gson.fromJson(json, MyClass.class);

    json = gson.toJson(mc);
    System.out.println(json);
}

class MyClass
{
    // String some:field;  <- You can do that!
     @SerializedName("some:field")
     String someField;
}

输出:

{“some:field”:“foo”}

 类似资料:
  • 问题内容: 如果json字段包含冒号(:),我们如何解析?像这样: 实际上,我想知道如何使用诸如restsharp之类的库来进行映射? 问题答案: 使用Json.Net 要么

  • 我正在努力用本地化反序列化世界天气在线API结果。 是否有更好、更简单的解决方案,只为lang对象编写一个自定义反序列化器,并允许GSON自动反序列化其余数据?

  • 问题内容: 我需要使用Google Gson库将简单Java对象列表序列化为JSON。 物体: 我编写了以下代码进行序列化: 它可以工作,但是JSON对象的字段名称是lowerCamelCase。像这样: 如何获取具有UpperCamelCase字段名称的JSON,如下所示: 我认为可以将成员变量重命名为UpperCamelCase,但是可能还有另一种方法吗? 问题答案: 来自文档: Gson支持

  • 问题内容: 在hibernate状态下使用sqlserver方言。 我希望hibernate在创建表时使用带引号的标识符。 除了重命名字段外,还有其他任何处理方法的想法吗? 问题答案: 遇到相同的问题,但表名为。如果你设定 然后所有数据库标识符将被引用。 在这里找到我的答案 表名称中的特殊字符hibernate给出错误 并在这里找到所有可用的设置 https://docs.jboss.org/hi

  • 我是JSON的新手,与我研究过的任何其他解析方法相比,我喜欢GSON Api的强大和直截了当。 我想解析一个相当复杂的JSON(使用GSON),就结构而言,它类似于下面的JSON: 我哪里出了问题? 是否有一种创建我所缺少的类的特殊方法? 注意:从结构的角度来看,我的JSON对象是完全有效的。如果您看到任何错误,这可能是因为当我手动创建上面的虚拟/演示时,它们出现了滑动。

  • 问题内容: 我有以下JSON代码段: 请注意,我不知道其名称,并且它们的命名约定 不一致, 因此无法创建相应的Java字段/变量名称。 如何在GSON中反序列化它? 在此先感谢您的帮助。 问题答案: 代码转储解决方案:

  • 问题内容: 我有一个像这样的POJO,我正在使用GSON序列化为JSON: 这是我的做法: 现在我的json将是这样的: 现在我的问题是:有什么办法可以代替更改变量名呢?在Gson中,我可以在变量顶部使用任何注释吗? 我想要这样的东西: 问题答案: 您可以使用@SerializedName(“ client_id”) 编辑: 您也可以使用它,以通用方式更改所有字段

  • 问题内容: Jackson json注释中以下jax-b注释的等效方式是什么? 我需要生成json而不是xml,并且需要了解在jax-b中等效表示的常规jackson批注。 重命名字段。 使用getter代替字段。 如果json / xml元素名称是Java保留字(例如“ ”,“ ”,“ ”等),则这些功能尤其重要。 因此我们必须将POJO字段分别命名为“ new ”,“ _ public ”,“