如何将json字符串动态转换为map

时间:2014-08-08 08:25:42

标签: java json

我有一个像这样的json输出 -

  {"menu": {
   "id": "12",
   "value": "File",
   "popup": {
       "menuitem": [
                  {"op1": "New", "op11": "CreateNewDoc()"},
                  {"op2": "Open", "op21": "OpenDoc()"},
                  {"op3": "Close", "op31": "CloseDoc()"}
                   ]
            }
      }}

我想要的是键和顺序,它应该在这样的地图中返回键值对,我不想对任何键进行编码 -

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

我该怎么做?

3 个答案:

答案 0 :(得分:0)

我使用过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;
}

用法。 前)

JsonNode json = jsonStringToJsonNode(jsonstring)
json.get("menu").get("id")  => result 12

我希望它会对你有所帮助。

答案 1 :(得分:0)

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

递归方法:

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);
        }
    }
}

你可以尝试任何一个。

示例代码:(使用 Jackson Library

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");
}

示例代码:使用GSON Library

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()"
}

答案 2 :(得分:0)

使用标准Java JSON Stream APIs,这将产生您想要的java.util.Map

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());
  }
}