假设我有 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/