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

时间:2017-10-16 19:13:51

标签: java json parsing gson

说我有4个项目

项目-A, 项目B, 项目C, 项目共同

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

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

project-a,project-b读取json

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

project-c读取以下内容:

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

我希望项目-com中的pojo类JsonLevel1,JsonLevel2和project-c中的JavaLevel3。但是,project-common不识别JavaLevel3类(因为project-c不是对项目公共的依赖)

我该怎么做?

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您的项目 - 共同类:

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中反序列化它。

所以,如果你想在你的project-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));