繁体   English   中英

如何将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")来检索 label 值。 如何从 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"));
    }
}

output 是;

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

这可能是由于您正在使用的 JsonReader。 我无法用 parseData 方法弄清楚解析器......

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

我会 go 与JSON Java 库 然后以这种方式解析值:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM