2013-02-11 2 views
2

Я создал набор классов (pojos), которые нужно преобразовать в json. потому что у меня есть ограничение, что имена полей json придерживаются определенного формата, я решил использовать gson как свою библиотеку выбора, поскольку он позволяет аннотации имен полей.Создайте JSON, используя GSON с двоеточием как часть имени поля

так что у меня есть имена полей json, такие как asset_type, preview_image_thumbnail и т. Д. Наряду с этим любые поля метаданных должны иметь формат, metadata:<metadata-field-name>.

так что это сводится к тому, что мои аннотациии metadata:site не будут преобразованы gson, так как они не являются действительными именами json field, по крайней мере, по словам 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(); 
} 
} 

ответ

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

Выход:

{ "некоторые из них: поле": "Foo"}

+0

да, я знаю, что достаточно хорошо , но, согласно gson, я не могу иметь двоеточие в аннотациях. Я отредактировал свой оригинальный вопрос, чтобы включить класс, который я хочу преобразовать в json, используя gson. – liltitus27

+1

Я не знаю, какую версию Gson вы используете, но вышеприведенный пример, который я опубликовал, является runnable и производит вывод, который я опубликовал. Это исключение не вызывает. Также скопируйте/вставьте свой класс в мою среду IDE, у Gson нет проблем с этим. Это с текущим Gson 2.2.2 –

+0

ну, вот и все - я использовал 1.7.1. Я ценю вашу помощь, Брайан, спасибо! – liltitus27

Смежные вопросы