2013-02-11 46 views
2

我创建了一组需要转换为json的类(pojos)。因为我有一个约束条件,即json字段名称遵循某种格式,我已经将gson作为我选择的库,因为它允许注释字段名称。用冒号作为字段名称的一部分使用GSON创建JSON

因此,我有json字段名称,如asset_typepreview_image_thumbnail等,以及任何元数据字段必须具有格式metadata:<metadata-field-name>。根据gson的说法,至少,我的metadata:tagsmetadata:site注释不会被gson转换,因为它们不是有效的json字段名称。

一切正常,除了那些梦幻般的元数据字段名称。我的目标是有类似以下的输出:

{ 
    "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(); 
} 
} 

回答

2

问题是那些无法直接映射到Java变量,因为您不能在变量名中包含冒号。您需要使用Gson @SerializedName注释。至少在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; 
} 

输出:

{ “一些:场”: “富”}

+0

是啊,我知道得很清楚,但根据gson的说法,我也不能在注释中留下冒号。我编辑了我的原始问题,包括我想转换为json的类,使用gson。 – liltitus27 2013-02-13 16:12:56

+1

我不知道你使用的是什么版本的Gson,但我发布的上面的例子是可运行的,并生成我发布的输出。它不会抛出异常。也可以将您的课程复制/粘贴到我的IDE中,Gson没有任何问题。这与目前的Gson 2.2.2 – 2013-02-13 16:27:21

+0

好,就是这样 - 我正在使用1.7.1。 我感谢您的帮助,布莱恩,谢谢! – liltitus27 2013-02-14 15:30:03

相关问题