如何在 Java 中创建如下所示的复杂结构的 JsonObject?

Posted

技术标签:

【中文标题】如何在 Java 中创建如下所示的复杂结构的 JsonObject?【英文标题】:How to create a JsonObject of complex structure like given below in Java? 【发布时间】:2022-01-14 00:28:26 【问题描述】:

    "A": 
        "B": 
            "C": 
                "D": "123"
            ,
            "E": 
                "F": 
                    "G": "aaabbb"
                ,
                "H": "QWE",
                "I": 
                    "J": "003",
                    "K": "01"
                
            ,
            "L": 
                "M": 
                    "N": "1603",
                    "O": "QWE"
                ,
                "P": "N",
                "Q": "N"
            ,
            "R": 
                "S": "10000",
                "T": "QWE"
            ,
            "U": 
                "V": "0",
                "W": "13"
            ,
            "X": 
                "Y": "123456"
            
        ,
        "ABC": 
            "QQ": "5",
            "WW": "O"
        
    

我想创建一个类似的 Json 字符串,而不必创建所有这些类 A、B、C 等。我可以通过使用 Jackson Library 的 ObjectMapper 为每个标签 A、B、C 等创建类来创建它.有没有更简单的方法来实现这一点?

【问题讨论】:

您可以使用嵌套地图或使用杰克逊的TreeNode 和实现直接构建层次结构。 你能给我一个粗略的例子吗? 好的,我会把它添加为答案 【参考方案1】:

正如我在评论中所述,有几种方法。

嵌套地图

ObjectMapper om = new ObjectMapper();
    
Map<String, Map<String, Map<String, Map<String, Object>>>> map = new HashMap<>();
    
map.computeIfAbsent("A", k -> new HashMap<>())
   .computeIfAbsent("B", k -> new HashMap<>())
   .computeIfAbsent("C", k -> new HashMap<>())
   .put("D", "123");
        
((Map<String, String>)map.computeIfAbsent("A", k -> new HashMap<>())
     .computeIfAbsent("B", k -> new HashMap<>())
     .computeIfAbsent("E", k -> new HashMap<>())
     .computeIfAbsent("F", k -> new HashMap<String, String>()))
     .put("G", "aaabbb");       
    
String json = om.writeValueAsString(map);

computeIfAbsent() 之类的方法有助于始终检查是否存在中间映射,但如您所见,如果结构不统一,则处理起来会很麻烦。

当然你也可以用其他方式构建地图,这只是一个简单的演示。

使用 ObjecNode(如果需要,还可以使用 ArrayNode)

ObjectMapper om = new ObjectMapper();

ObjectNode root = om.createObjectNode();
ObjectNode nodeA = om.createObjectNode();
root.set("A", nodeA);
    
ObjectNode nodeB = om.createObjectNode();
nodeA.set("B", nodeB);
    
ObjectNode nodeC = om.createObjectNode();
nodeB.set("C", nodeC);
nodeC.put("D", "123");
    
ObjectNode nodeE = om.createObjectNode();
nodeB.set("E", nodeE);
    
ObjectNode nodeF = om.createObjectNode();
nodeE.set("F", nodeF);
nodeF.put("G", "aaabbb");

String json = om.writeValueAsString(root);

同样有多种方法可以构建此节点层次结构。

这两个示例都会生成以下(未格式化的)json,它反映了您的结构的第一部分:

"A":"B":"C":"D":"123","E":"F":"G":"aaabbb"

【讨论】:

你的代码对@thomas 很有帮助!我想了解一下您是如何如此高效地编写代码的。老实说,如果不是你,我会创建 10 个不同的类,并在构建根类的对象后生成 JSON 字符串。 @AakashThakur 谢谢,我想说这只是经验(与杰克逊和一般编码)和编写可读但高效代码的愿望:) 我很确定有很多领域我的代码会更糟糕的地方:) 想象一下相同的结构 JSON 是我收到的响应。你能告诉我一个类似的方法来读取这些值吗? @托马斯 @AakashThakur 您可以使用readTree() 方法获取JsonNode,您需要检查它是否是ObjectNode 实例。或者您可以使用readValue() 并传递TypeReference&lt;Map&lt;String, ?&gt;&gt; 左右。 readTree() 可能更容易。 @AakashThakur 不,你使用readTree(),取回根节点然后需要遍历树并查找你想要的数据或查看它包含的数据。

以上是关于如何在 Java 中创建如下所示的复杂结构的 JsonObject?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JSONObject 在 Java 中创建正确的 JSONArray

如何在 PyQt 中创建“色环”?

怎样在MATLAB中创建空的N维数组?

通过合并空白主字典中的字典,在 Python 中创建具有特定结构的 JSON

如何在 xcode 中创建“删除”操作表?

如何在 CSS 中创建径向菜单?