Osa*_*rez 5 java android gson json-deserialization
我正在尝试反序列化以下结构
{ meta: { keywords: [a, b, c, d]} ... }
Run Code Online (Sandbox Code Playgroud)
其他有效结构是
{ meta: { keywords: "a,b,c,d"} ... }
Run Code Online (Sandbox Code Playgroud)
和
{ meta: {keywords: "a"} ...}
Run Code Online (Sandbox Code Playgroud)
我有这节课
public class Data {
@PropertyName("meta")
MetaData meta;
...
}
public class MetaData {
List<String> keywords;
...
}
Run Code Online (Sandbox Code Playgroud)
和自定义解串器
public static class CustomDeserilizer implements JsonDeserializer<MetaData>{
@Override
public MetaData deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
List<String> keywords = null;
Gson gson = new Gson();
MetaData metaData = gson.fromJson(json, AppMetaData.class);
JsonObject jsonObject = json.getAsJsonObject();
if (jsonObject.has("keywords")) {
JsonElement elem = jsonObject.get("keywords");
if (elem != null && !elem.isJsonNull()) {
if (jsonObject.get("keywords").isJsonArray()) {
keywords = gson.fromJson(jsonObject.get("keywords"), new TypeToken<List<String>>() {
}.getType());
} else {
String keywordString = gson.fromJson(jsonObject.get("keywords"), String.class);
keywords = new ArrayList<String>();
list.addAll(Arrays.asList(keywordString.split(",")));
}
}
}
metaData.setKeywords(keywords);
}
Run Code Online (Sandbox Code Playgroud)
然后,我尝试应用除菌器:
Gson gson = new GsonBuilder()
.registerTypeAdapter(Data.class,new CustomDeserilizer())
.create();
Run Code Online (Sandbox Code Playgroud)
但是我遇到了一个解析错误,因为正在尝试对数据进行反序列化而不是对MetaData进行反序列化,我如何应用此反序列化器以使其正常工作?
我解决了这个问题,为我的班级数据创建了一个反序列化器。
public static class DataDeserilizer implements JsonDeserializer {
@Override
public Data deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
Gson gson = new Gson();
Data data = gson.fromJson(json, Data.class);
JsonObject jsonObject = json.getAsJsonObject();
if (jsonObject.has("meta")) {
JsonElement elem = jsonObject.get("meta");
if (elem != null && !elem.isJsonNull()) {
Gson gsonDeserializer = new GsonBuilder()
.registerTypeAdapter(MetaData.class, new CustomDeserilizer())
.create();
gsonDeserializer.fromJson(jsonObject.get("meta"), Data.class);
}
}
return data;
}
}
Run Code Online (Sandbox Code Playgroud)
和
Gson gson = new GsonBuilder()
.registerTypeAdapter(Data.class,new DataDeserilizer())
.create();
Run Code Online (Sandbox Code Playgroud)
很明显,但是还有更优雅的解决方案吗?
| 归档时间: |
|
| 查看次数: |
7458 次 |
| 最近记录: |