java - Gson解析: Bean Structure in different projects

标签 java json parsing gson

假设我有 4 个项目

项目-a, 项目-b, 项目-c, 项目通用

project-common 在所有其他项目中设置为依赖项(maven)。

现在每个项目读取单独的 json 文件。

项目-a、项目-b读取以下json

 { "jsonLevel1" : { 
       "jsonLevel2" : {
            "key1" : "value1",
            "key2" : "value2"
    }
}

project-c 读取以下内容:

  { "jsonLevel1" : { 
           "jsonLevel2" : {
                "key1" : "value1",
                "key2" :"value2",
                "key3" : "value3",
                "jsonLevel3" : {
                     "string1" : "value11",
                     "string2" : "value22"
             }
        }
    }

我想要在project-common中有pojo类JsonLevel1、JsonLevel2,在project-c中有JavaLevel3。但是,project-common 无法识别JavaLevel3 类(因为project-c 不是project-common 的依赖项)

我怎样才能做到这一点?

最佳答案

如果我理解正确,你的project-common类中有:

JsonLevel1.java

public class JsonLevel1 {
    JsonLevel2 jsonLevel2;

}

JsonLevel2.java

public class JsonLevel2 {
    String key1;
    String key2;
    String key3;
    JsonLevel3 jsonLevel3;
}

而在 JsonLevel2 类中,由于该项目中没有 JsonLevel3 类,因此存在您的问题。

你可以这样做。在 JsonLevel2 类中,您可以插入一个 Map,而不是 JsonLevel3 类:

public class JsonLevel2 {
    String key1;
    String key2;
    String key3;
    Map<String,String>jsonLevel3;

    public String getKey1() {
        return key1;
    }

    public void setKey1(String key1) {
        this.key1 = key1;
    }

    public String getKey2() {
        return key2;
    }

    public void setKey2(String key2) {
        this.key2 = key2;
    }

    public String getKey3() {
        return key3;
    }

    public void setKey3(String key3) {
        this.key3 = key3;
    }

    public Map<String, String> getJsonLevel3() {
        return jsonLevel3;
    }

    public void setJsonLevel3(Map<String, String> jsonLevel3) {
        jsonLevel3 = jsonLevel3;
    }
}

这样你的项目中就没有问题了,你可以解析json。

project-c中,存在JsonLevel3类,在JsonLevel对象中反序列化你的json后,你可以得到这个映射并在你的JsonLevel3中反序列化它。

所以,如果你想在你的项目-c中读取这个json:

{ "jsonLevel1" : { 
           "jsonLevel2" : {
                "key1" : "value1",
                "key2" :"value2",
                "key3" : "value3",
                "jsonLevel3" : {
                     "string1" : "value11",
                     "string2" : "value22"
             }
        }
    }}

你可以这样做:

        Gson gson = new Gson();
        String filename="/pathTo/json.json";
        JsonReader reader = new JsonReader(new FileReader(filename));
        JsonLevel jsonlevel= gson.fromJson(reader, JsonLevel.class);
        System.out.println("jsonlevel: " + gson.toJson(jsonlevel));

        Map<String, String> jl3 = jsonlevel.getJsonLevel1().getJsonLevel2().getJsonLevel3();
        /*for (Map.Entry<String, String> entry : jl3.entrySet())
        {
            System.out.println(entry.getKey() + "/" + entry.getValue());
        }*/
        JsonLevel3 jlev3=gson.fromJson(gson.toJson(jl3), JsonLevel3.class);
        System.out.println("jlev3: " + gson.toJson(jlev3));

当然,JsonLevel 类等于

public class JsonLevel {

    JsonLevel1 jsonLevel1;

    public JsonLevel1 getJsonLevel1() {
        return jsonLevel1;
    }

    public void setJsonLevel1(JsonLevel1 jsonLevel1) {
        this.jsonLevel1 = jsonLevel1;
    }
}

编辑

我认为你的最终 json 具有你的问题描述的结构。这就是为什么我使用 Map<String,String>对于 JsonLevel3。

如果 JsonLevel3 不是您的最后一个级别,而不是使用 Map<String,String> ,您可以使用 Map<String, Object>

例如,如果 json 为:

{
  "jsonLevel1":{
    "jsonLevel2":{
      "key1":"value1",
      "key2":"value2",
      "key3":"value3",
      "jsonLevel3":{
        "string1":"value11",
        "string2":"value22",
        "jsonLevel4":{
          "int1":1,
          "int2":2
        }
      }
    }
  }
}

JsonLevel2 将是:

public class JsonLevel2 {
    String key1;
    String key2;
    String key3;
    Map<String,Object>jsonLevel3;

这样,map 的值就可以是一切(不再像以前那样强制为 String)。因此,在反序列化 json 后,无论 JsonLevel3 的内容是什么,您都可以执行与之前相同的操作:

    Gson gson = new Gson();
    String filename="/pathTo/json.json";
    JsonReader reader = new JsonReader(new FileReader(filename));
    JsonLevel jsonlevel= gson.fromJson(reader, JsonLevel.class);
    System.out.println("jsonlevel: " + gson.toJson(jsonlevel));

    Map<String, Object> jl3 = jsonlevel.getJsonLevel1().getJsonLevel2().getJsonLevel3();
    Map<String, Integer> jl4= (Map<String, Integer>) jl3.get("jsonLevel4");

    JsonLevel3 jlev3=gson.fromJson(gson.toJson(jl3), JsonLevel3.class);
    JsonLevel4 jlev4= gson.fromJson(gson.toJson(jl4), JsonLevel4.class);

    System.out.println("jlev3: " + gson.toJson(jlev3));
    System.out.println("jlev4: " + gson.toJson(jlev4));

关于java - Gson解析: Bean Structure in different projects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46777533/

相关文章:

jquery - 按字母顺序对 JSON 进行排序

java - 如何使用 SimpleDateFormat 解析多种格式的日期

java - graphql-java 12.0 中的 GraphqlFieldVisibility

java - 如何使用 Proguard 或其他工具删除未使用的重写 toString() 方法?

java - 如何关闭并图标化 JavaFx 阶段

json - 使用查找表的 Hive 查询

java - 在 IntelliJ 中启用 Spring 插件时,某些插件显示错误 'com.spring.intellij not installed'

java - 对通用对象列表使用 @JsonTypeInfo 注释

Blackberry OS 5 的 Json 解析器

windows - 为 XNA 游戏实现基于 XML 的简单脚本语言