有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

假设我有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的依赖项)

我该怎么做


共 (1) 个答案

  1. # 1 楼答案

    如果我理解正确的话,你在你的公共项目课程中:

    JSONLevel 1。爪哇

    public class JsonLevel1 {
        JsonLevel2 jsonLevel2;
    
    }
    

    JsonLevel2。爪哇

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

    这样,您的项目中就没有问题了,您可以解析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有你问题描述的结构。这就是为什么我对JsonLevel3使用了Map<String,String>

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

    例如,如果要发送的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;
    

    通过这种方式,映射的值可以是一切(不像以前那样强制为字符串)。因此,在您将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));