【问题标题】:Deep JSON structures to Java object, is there a better way than what I did? It looks horrendous深度 JSON 结构到 Java 对象,有没有比我做的更好的方法?看起来很可怕
【发布时间】:2019-11-27 08:38:45
【问题描述】:

所以我得到了这个 JSON 结构作为 HTTP 响应。结构如下:

{
    "field1": "value1",
    "field2": {
        "field2-2": [
            {
                "field2-2-1": "some value",
                "field2-2-2": {
                    "key" : "some value"
                }
            }
        ]
    }
}

当然我简化了它,但你明白了。现在我使用 Gson 将其转换为 HashMap:

HashMap<String, Object> resultMap = new Gson().fromJson(httpResult, type);

现在,要在 Java 中访问“field2-2-2”,我这样做:

LinkedTreeMap someMap = (LinkedTreeMap) resultMap.get("field2");
ArrayList<LinkedTreeMap> someList = (ArrayList) someMap.get("field2-2");
LinkedTreeMap anotherMap = someList.get(0);
anotherMap.get("key");

我再次对其进行了简化,但有没有更好的方法来访问这个“深层”字段?或者为了可读性,我可以以某种方式链接方法吗?我的意思是,如果这一切都是 ArrayLists,我可以这样做:

ArrayList<Arraylist<String>> sampleList = new ArrayList<>();
sampleList.get(0).get(0);

【问题讨论】:

  • 您是否尝试过将此结构直接反序列化为匹配的 POJO?
  • 你能使用像JacksonJsonPath这样的库吗?如果是,它们允许您提供类似/field2/field2-2/field2-2-2/key 的路径。 Jackson 支持 JSON Pointer。也可以看看:Parsing deeply nested JSON properties with JacksonIterate over a large JSON Array with JSONPath
  • Michał Ziober,我认为这是最有用的回复,谢谢
  • @MaxUrbanowicz,应该很容易使用JsonPathJsonPointerJackson。如果您发现问题,只需使用您拥有的代码更新问题并提出新问题。
  • 我建议考虑面向流的解析而不是对象映射。 Gson 和 Jackson 都支持它。另外,你可以看一个简单快速的解析器示例github.com/anatolygudkov/green-jelly

标签: java json gson pojo


【解决方案1】:

您可以直接将其映射到 POJO 类。喜欢:

@JsonInclude(Include.NON_NULL)
public class ApiResponse {

    String field01;
    Field2Class field02;

}

Field2Class.class

public class Field2Class {

   ArrayList<Field02_2> field02_2;

}

Field02_2.class

public class Field02_2 {

   String field02_2_1, field02_2_2;

}

每个类都有 getter、setter 和默认构造函数。

【讨论】:

  • 我使用一些在线 JSON -> POJO 转换器尝试了这种方法,但问题是我的 JSON 非常庞大,我的 POJO 将像 50 个对象,这就是为什么我选择 Gson 转换成的 HashMap 就好了。我只是想知道我是否可以更好地访问深层领域
  • 如果你使用 POJO,那么你只需要声明一次类中的所有字段,那么当你收到 HTTP 响应时,它会直接映射到这些 POJO。因此,如果将来您更新/删除了一些额外的字段,您只需更改此 JAVA 文件。同样要获取任何字段,您可以简单地调用 getFieldMethod() 而不是先将其映射到 Map ,然后像您所做的那样使用嵌套映射获取其嵌套字段。同样,如果您的响应发生变化,那么无论您必须获取该字段的任何位置,都会有很多代码更改。
  • 对于庞大的JSON,如果您能提供完整的JSON以便更好地理解会有所帮助
猜你喜欢
  • 2021-07-27
  • 2013-04-04
  • 1970-01-01
  • 2015-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多