JAVA中的动态Json解析并找到键和值对?

JAVA中的动态Json解析并找到键和值对?,java,json,parsing,Java,Json,Parsing,请记住,JSON结构之前是未知的,即它是完全任意的,我们只知道它是JSON格式 比如说,, 下面是JSON { "id": 1, "name": "Foo", "price": 123, "tags": [ { "Bar":"23", "Eek":"24" } ] } 我们可以这样做来遍历树,并跟踪我们想要找出点符号属性名称的深度 我们如何在编译时获得数据键,在运行时获得值 import com.fasterxml.jackson.databind

请记住,JSON结构之前是未知的,即它是完全任意的,我们只知道它是JSON格式

比如说,, 下面是JSON

{
  "id": 1,
  "name": "Foo",
  "price": 123,
  "tags": [
    {
    "Bar":"23",
    "Eek":"24"
  }
]
}

我们可以这样做来遍历树,并跟踪我们想要找出点符号属性名称的深度

我们如何在编译时获得数据键,在运行时获得值

import com.fasterxml.jackson.databind.JsonNode;
导入com.fasterxml.jackson.databind.ObjectMapper;
导入com.fasterxml.jackson.databind.node.ArrayNode;
导入com.fasterxml.jackson.databind.node.ObjectNode;
导入com.fasterxml.jackson.databind.node.ValueNode;
导入java.io.File;
导入java.io.IOException;
导入java.util.*;
公共班机{
公共静态void main(字符串[]args){
File File=新文件(“src/data.json”);
ObjectMapper mapper=新的ObjectMapper();
试一试{
LinkedHashMap=新建LinkedHashMap();
JsonNode=mapper.readTree(文件);
getKeys(“”,节点,映射);
对于(Map.Entry:Map.entrySet()){
System.out.println(“Key:+entry.getKey()+”+“+”+”值:“+entry.getValue());
}
}捕获(IOE异常){
e、 printStackTrace();
}
}
公共静态void getKeys(字符串currentpath、JsonNode节点、LinkedHashMap映射){
if(node.isObject()){
ObjectNode ObjectNode=(ObjectNode)节点;
迭代器it=objectNode.fields();
字符串前缀=currentpath.isEmpty()?“”:currentpath+”;
while(it.hasNext()){
SortedMap.Entry iter=it.next();
getKey(前缀+iter.getKey(),iter.getValue(),map);
}
}else if(node.isArray()){
ArrayNode ArrayNode=(ArrayNode)节点;

对于(int i=0;i来说,处理一个你一无所知的json结构是很少见的。如果你不知道你在寻找什么样的值,那么这些数据怎么会有用呢

在特殊情况下,您需要遍历整个树,因此必须使用递归。因为每个字段(
字段
)都可以有一个简单的值(
“字段”:1
)、一个对象(
“字段”:{“b”:1}
)或一个数组(
“字段”:[1,2,3]

下面的代码显示了如何使用

publicstaticvoidmain(字符串[]args)引发IOException{
File File=新文件(“data.json”);
ObjectMapper mapper=新的ObjectMapper();
JsonNode=mapper.readTree(文件);
进程节点(node);
}
私有静态void processNode(JsonNode节点){
if(node.isArray()){
//如果节点是项目列表,
//检查所有项目并分别进行处理
System.out.println(“==数组开始==”);
for(最终JsonNode对象数组:node){
System.out.println(“--Array element start--”;
//处理数组中的项
processNode(objInArray);
System.out.println(“--Array element end--”);
}
System.out.println(“==数组结束==”);
}else if(node.isContainerNode()){
//如果节点是一个对象,
//遍历对象中的所有字段
System.out.println(“///对象开始//”);
迭代器it=node.fields();
while(it.hasNext()){
Map.Entry field=it.next();
System.out.println(“key:+field.getKey());
//处理数组中的每个字段
processNode(field.getValue());
}
System.out.println(“///对象结束//”);
}否则{
//若节点是一个简单的值(比如string或int),那个么让我们打印它
System.out.println(“值:+节点”);
}
}
您提供的示例json提供了以下输出:

=== Array start ===
--- Array element start ---
/// Object start ///
key: id
value: 1
key: name
value: "Leanne Graham"
key: username
value: "Bret"
key: email
value: "Sincere@april.biz"
key: address
/// Object start ///
key: street
value: " Light"
key: suite
value: "Apt. 556"
key: city
value: "Gwugh"
key: zipcode
value: "93874"
key: geo
/// Object start ///
key: lat
value: "-37.319"
key: lng
value: "81.146"
/// Object end ///
/// Object end ///
key: phone
value: "8031 x56442"
key: website
value: "hilded.org"
key: company
/// Object start ///
key: name
value: "Romra-Crona"
key: catchPhrase
value: " client-server neural-net"
key: bs
value: "harness markets"
/// Object end ///
/// Object end ///
--- Array element end ---
=== Array end ===

Process finished with exit code 0


你可以说,我没有从那件事中弄清楚。我们不知道关键不是全部,那么我们如何使用(“公司”)。我们必须找到每次都是动态的关键和价值观,然后利用这些关键和价值观them@saqibriaz很抱歉我错过了。现在添加了一些关于如何处理未知字段的内容。