2

json に変換する必要がある一連のクラス (pojos) を作成しました。json フィールド名が特定の形式に準拠しているという制約があるため、フィールド名の注釈を可能にするため、選択したライブラリとして gson に落ち着きました。

asset_typeそのため、 、 などの json フィールド名がpreview_image_thumbnailあります。それに加えて、メタデータ フィールドはmetadata:<metadata-field-name>.

したがって、少なくとも gson によれば、mymetadata:tagsおよび注釈は有効な json フィールド名ではないため、gson によって変換されないということになります。metadata:site

それらのメタデータフィールド名を除いて、すべてがうまく機能します。私の目標は、次のような出力を得ることです。

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

1 に答える 1

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;
}

出力:

{"some:field":"foo"}

于 2013-02-11T20:34:02.243 に答える