如何将Object类型转换为HashMap

How to convert Object type to HashMap

我正在尝试以我自己的方式解析 JSON,但我一直坚持将 List 转换为 Map:

   public static void main ( final String[] args ) throws Exception
   {
      {
         String test = new String("[{\"label\": 1, \"value\": 12345}, {\"label\": 2, \"value\": 12}]");
         final StringReader stringReader = new StringReader(test);
         final Object obj = new JSONReader( stringReader ).parseData();
         List list = (List)obj;  // [{label=1, value=12345}, {label=2, value=12}] looks good
         System.out.println(list);
         for (Object o : list) {
             System.out.println(o);  // {label=1, value=12345} {label=2, value=12} also looks ok
                     if (!(o instanceof Map)) {
            throw new IllegalArgumentException("Root object must be a JSON object.");
        }
         }
      }

以下代码不会抛出异常,因此 o 是 Map 的实例。但是我不能使用 o.get("label") 来检索标签值。如何从标签和值字段中获取每个值?

实际上它适用于 objectMapper

@Test
void t2() throws IOException {
    String test = new String("[{\"label\": 1, \"value\": 12345}, {\"label\": 2, \"value\": 12}]");
    final StringReader stringReader = new StringReader(test);
    final Object obj = new ObjectMapper().readValue(stringReader, Object.class);
    List list = (List)obj;  // [{label=1, value=12345}, {label=2, value=12}] looks good
    System.out.println(list);
    for (Object o : list) {
        System.out.println(o);  // {label=1, value=12345} {label=2, value=12} also looks ok
        if (!(o instanceof Map)) {
            throw new IllegalArgumentException("Root object must be a JSON object.");
        }
        System.out.println(((Map)o).get("label"));
    }
}

输出为;

[{label=1, value=12345}, {label=2, value=12}]
{label=1, value=12345}
1
{label=2, value=12}
2

这可能是由于您使用的 JsonReader。我无法用 parseData 方法找出解析器...

您应该尝试删除关键字 Object。这样你就不确定你在解析什么,并且你得到的元素可能不是 list.

我会选择 JSON Java Library。 然后这样解析值:

String test = "[{\"label\": 1, \"value\": 12345}, {\"label\": 2, \"value\": 12}]";
JSONArray jsonArray = new JSONArray(test);

for (Object o : jsonArray)
{
    JSONObject jsonObject = (JSONObject) o;
    System.out.println(jsonObject);
}

如您所见,JSONArrayJSONObject 可用于解析。他们提供了几个有助于使用它们的功能。

我的方法命题使用简单的 org.json 库 (2009) 并且完全不同:

private Map<Integer, Integer> convertJsonToMap(String test) throws JSONException {
    Map<Integer, Integer> map = new HashMap<>();
    JSONArray jsonArray = new JSONArray(test);
    for (int i = 0; i < jsonArray.length(); i++) {
        JSONObject jsonObject = jsonArray.getJSONObject(i);
        if (jsonObject.length() == 2) {
            map.put((Integer) jsonObject.get(jsonObject.names().getString(0)),
                    (Integer) jsonObject.get(jsonObject.names().getString(1)));
        }
    }
    return map;
} 

Returns 仅整数,如果任何“标签”或“值”是字符串,则可能抛出 ClassCastException。