Java Gson解析:不同项目中的Bean结构

Java Gson解析:不同项目中的Bean结构,java,json,parsing,gson,Java,Json,Parsing,Gson,假设我有4个项目 项目a, b项目, 项目c, 项目通用性 project common在所有其他项目中设置为依赖项(maven) 现在每个项目读取单独的json文件 project-a、project-b读取以下json { "jsonLevel1" : { "jsonLevel2" : { "key1" : "value1", "key2" : "value2" } } 项目c内容如下: { "jsonLevel

假设我有4个项目

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

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

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

project-a、project-b读取以下json

 { "jsonLevel1" : { 
       "jsonLevel2" : {
            "key1" : "value1",
            "key2" : "value2"
    }
}
项目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的依赖项)


我该怎么做

如果我理解正确,您的公共项目中有:

JsonLevel1.java

public class JsonLevel1 {
    JsonLevel2 jsonLevel2;

}
JsonLevel2.java

public class JsonLevel2 {
    String key1;
    String key2;
    String key3;
    JsonLevel3 jsonLevel3;
}
在JsonLevel2类中,因为在这个项目中没有JsonLevel3类,所以存在您的问题

你可以这样做。在类JsonLevel2中,可以插入映射,而不是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;
    }
}
你可以做:

        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));
编辑

我认为你最后的json有你问题描述的结构。这就是为什么我对JsonLevel3使用了
映射

如果JsonLevel3不是您的最后一级,您可以使用
映射,而不是使用
映射

例如,如果要发送的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;
公共类JsonLevel2{
字符串键1;
字符串键2;
字符串键3;
MapjsonLevel3;
通过这种方式,映射的值可以是一切(不像以前那样强制为字符串)。因此,在反序列化json之后,您可以执行与以前相同的操作,无论JSONLevel 3的内容是什么:

    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));
Gson-Gson=new-Gson();
字符串filename=“/pathTo/json.json”;
JsonReader=newjsonreader(newfilereader(filename));
JsonLevel JsonLevel=gson.fromJson(reader,JsonLevel.class);
System.out.println(“jsonlevel:+gson.toJson(jsonlevel));
Map jl3=jsonlevel.getJsonLevel1().getJsonLevel2().getJsonLevel3();
Map jl4=(Map)jl3.get(“jsonLevel4”);
JsonLevel3 jlev3=gson.fromJson(gson.toJson(jl3),JsonLevel3.class);
jsonlevel4jlev4=gson.fromJson(gson.toJson(jl4),JsonLevel4.class);
System.out.println(“jlev3:+gson.toJson(jlev3));
System.out.println(“jlev4:+gson.toJson(jlev4));

这是一个很好的解决方法。但问题是JsonLevel3可能不是最后一级。它可能包含JsonLevel4。在project-d中,JsonLevel4结构是不同的。实际上几乎有10个项目,相同的json结构达到第3级,然后不同的项目就不同了。我想保持通用类结构In普通项目。只有一个问题。当通过迭代从映射读取值时。如何区分基本体和对象。
public class JsonLevel2 {
    String key1;
    String key2;
    String key3;
    Map<String,Object>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));