java - 使用 GSON 反序列化嵌套对象

标签 java gson json-deserialization android

我正在尝试反序列化以下结构

{ meta: { keywords:  [a, b, c, d]}  ...  }

其他有效结构是

{ meta: { keywords: "a,b,c,d"}  ... }

{ meta: {keywords: "a"}  ...}

我有这门课

public class Data {
   @PropertyName("meta")
   MetaData meta;
   ...
}


public class  MetaData {
    List<String> keywords;
    ...
}

和自定义反序列化器

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

然后我尝试应用反序列化器:

Gson gson = new GsonBuilder()              
        .registerTypeAdapter(Data.class,new CustomDeserilizer())               
        .create();

但是我得到一个解析错误,因为我正在尝试反序列化数据而不是元数据,我该如何应用这个反序列化器才能使其正常工作?

最佳答案

我解决了为我的类数据创建反序列化器的问题。

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



}

Gson gson = new GsonBuilder()              
    .registerTypeAdapter(Data.class,new DataDeserilizer())               
    .create();

很明显,但有没有更优雅的解决方案?

关于java - 使用 GSON 反序列化嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40919940/

相关文章:

python - 序列化和反序列化用户定义类中的对象

java - Mockito isA(Class<T> clazz) 如何解决类型安全问题?

java - 为什么 Java Swing 程序不能显示变音符号(ä、ö、...)等德语字符?

java - WebRenderer Swing 和服务器版

java - 为什么我无法使用 Gson 从 json 获取嵌套数据?

java - 如何确保 Map<String, Object> 中的 Java 数组在 GSON toJson 和 fromJson 后保持其类型

javascript - 如何将多级 JavaScript 对象反序列化为 HTML 表单?

java - 分发我不。 n 中的项目数箱子的数量,其中每个箱子具有不同的容量级别 c1、c2

java - 重新启动应用程序时加密 key 会更改吗?

java - Spring Kafka 自定义反序列化器