gpt4 book ai didi

java - 如果我在解析之前不知道所有 json 字段,如何将 JSON 转换为 Java 对象?

转载 作者:行者123 更新时间:2023-12-01 23:26:09 29 4
gpt4 key购买 nike

我的服务可以接收几种不同的json,例如:

{
"event":"conversation_started",
"context":"context information",
"user":{
"id":"01234567890A=",
"name":"John McClane",
"avatar":"http://avatar.example.com",
"country":"UK",
"language":"en",
"api_version":1
},
"subscribed":false
}

 {
"event":"message",
"message":{
"type":"text",
"text":"a message to the service",
"location":{
"lat":12.34,
"lon":12.34
}
}
}

或其他几个 json。所有 json 中唯一相同的字段是“event”。所有其他字段可以不同(取决于“事件”值)。

所以问题是:如何将这些 json 转换为 java 对象(而不产生困惑的代码)?我知道的唯一方法是手动检查“事件”值(如 json.startsWith("{\n\"event\":\"message\"") 但我确信这样做有任何简单的决定。

最佳答案

我通过三种方式做到了这一点。第一个是执行您的建议 - 解析 JSON、检查类型并创建对象。使用字符串解析器时要非常小心,因为您可能有也可能没有新行之类的东西。相反,请执行以下操作:

ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(eventString);
String eventType = jsonNode.get("event").asText();

if( eventType.equalsIgnoreCase("conversation_started")) {
// create ConversationStarted object using something like:
ConversationStarted conversationStarted = objectMapper.readValue( eventString, ConversationStarted.class );
}

当然,这要求所有类都有一个具体的 POJO 以允许反序列化。

另一种方法是做许多其他编程语言所做的事情并拥有键/值映射。有几种方法可以做到这一点。其中之一是 Jackson 图书馆:

Map<String, Object> map = objectMapper.readValue(eventString, new TypeReference<Map<String,Object>>(){});

Map<String, Object> user = (Map<String, Object>) map.get("user");

System.out.println( "conversation started - avatar is " + user.get("avatar"));

这样您就可以传递 map 并根据需要提取。请注意,您仍然需要了解 JSON 的结构,但不需要为其提供 POJO。

最后是第二种解决方案的变体。使用JSONPath你可以直接拉出你需要的东西。同样,您需要首先检查您的 Activity 类型。像这样的东西:

if( JsonPath.read(eventString, "$.event").equals("conversation_started") ) {
String avatar = JsonPath.read(eventString, "$.user.avatar");
System.out.println("conversation started - avatar is " + avatar);
}

最后两种方法要求您一次提取一个值,如图所示。第一个解决方案为您提供了一个完整的对象来使用。您可以决定什么最适合您的环境。

关于java - 如果我在解析之前不知道所有 json 字段,如何将 JSON 转换为 Java 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58307107/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com