Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将json字符串动态转换为映射_Java_Json - Fatal编程技术网

Java 如何将json字符串动态转换为映射

Java 如何将json字符串动态转换为映射,java,json,Java,Json,我有这样一个json输出- {"menu": { "id": "12", "value": "File", "popup": { "menuitem": [ {"op1": "New", "op11": "CreateNewDoc()"}, {"op2": "Open", "op21": "OpenDoc()"}, {"op3": "Close", "o

我有这样一个json输出-

  {"menu": {
   "id": "12",
   "value": "File",
   "popup": {
       "menuitem": [
                  {"op1": "New", "op11": "CreateNewDoc()"},
                  {"op2": "Open", "op21": "OpenDoc()"},
                  {"op3": "Close", "op31": "CloseDoc()"}
                   ]
            }
      }}
我想要的是键和顺序,它应该在这样的映射中返回键值对,我不想对任何键进行harcode-

      id=12
      value=File
      op1=New
      op11=CreateNewDoc()
      op2=Open
      op21=OpenDoc()
      op3=Close
      op31=CloseDoc()

我将如何做呢?

我已经使用了Jackson Json

首先。我将Json字符串更改为JsonNode

ex)JsonString到JsonNode

public static JsonNode jsonStringToJsonNode(String json){
    ObjectMapper mp = new ObjectMapper();   

    try {
        return mp.readValue(json, JsonNode.class);
    } catch (JsonParseException e) {

    } catch (JsonMappingException e) {

    } catch (IOException e) {

    }
    return null;
}
用法。 ex)


我希望它能帮助您。

只需将JSON字符串转换为
Map
,然后使用递归提取所需的值

递归方法:

public static void process(String key, Object value, Map<String, String> newMap){
    if (value instanceof String) {
        newMap.put(key, (String) value);
    } else if (value instanceof Map) {
        Map<String, Object> map = (Map<String, Object>) value;
        for (Entry<String, Object> entry : map.entrySet()) {
            process(entry.getKey(), entry.getValue(), newMap);
        }
    } else if (value instanceof List) {
        List<Object> list = (List<Object>) value;
        for (Object obj : list) {
            process(key, obj, newMap);
        }
    }
}
使用标准,这将产生您想要的:

Map<String, String> values = new HashMap<>();
String keyName = null;

JsonParser jsonParser = Json.createParser(new StringReader(json));

while (jsonParser.hasNext())
{
  JsonParser.Event event = jsonParser.next();

  if (JsonParser.Event.KEY_NAME.equals(event))
  {
    keyName = jsonParser.getString();
  }
  else if (JsonParser.Event.VALUE_STRING.equals(event))
  {
    values.put(keyName, jsonParser.getString());
  }
}
Map values=newhashmap();
字符串keyName=null;
JsonParser-JsonParser=Json.createParser(新的StringReader(Json));
while(jsonParser.hasNext())
{
事件事件=JsonParser.next();
if(JsonParser.Event.KEY_NAME.equals(Event))
{
keyName=jsonParser.getString();
}
else if(JsonParser.Event.VALUE_STRING.equals(Event))
{
value.put(keyName,jsonParser.getString());
}
}

您使用过Jackson或Gson吗?使用JSON序列化框架并构建自定义反序列化程序。@Aksapy,是的,我使用过,但我找不到任何不使用harcoding key/value的方法。到目前为止,您尝试了什么?您看过使用
javax.json.stream.JsonParser
()吗?它会给出所需的输出吗?
TypeReference<Map<String, Object>> typeRef = new TypeReference<Map<String, Object>>() {};
ObjectMapper mapper = new ObjectMapper();
try {
    Map<String, Object> data = mapper.readValue(jsonString, typeRef);
    Map<String, String> newMap = new HashMap<String, String>();
    process("menu", data.get("menu"), newMap);
    System.out.println(new JSONObject(newMap));
} catch (Exception e) {
    System.out.println("There might be some issue with the JSON string");
}
Type type = new TypeToken<Map<String, Object>>() {}.getType();
Map<String, Object> data = new Gson().fromJson(jsonString, type);
Map<String, String> newMap = new HashMap<String, String>();
process("menu", data.get("menu"), newMap);
System.out.println(new GsonBuilder().setPrettyPrinting().create().toJson(newMap));
{
  "op1": "New",
  "id": "12",
  "op21": "OpenDoc()",
  "op2": "Open",
  "op3": "Close",
  "op11": "CreateNewDoc()",
  "value": "File",
  "op31": "CloseDoc()"
}
Map<String, String> values = new HashMap<>();
String keyName = null;

JsonParser jsonParser = Json.createParser(new StringReader(json));

while (jsonParser.hasNext())
{
  JsonParser.Event event = jsonParser.next();

  if (JsonParser.Event.KEY_NAME.equals(event))
  {
    keyName = jsonParser.getString();
  }
  else if (JsonParser.Event.VALUE_STRING.equals(event))
  {
    values.put(keyName, jsonParser.getString());
  }
}