【问题标题】:get the size of an array using jackson使用杰克逊获取数组的大小
【发布时间】:2016-12-27 08:35:42
【问题描述】:

我在 json 文件中有以下数据。

{  
   "product":"Data",
   "data":{  
      "zip":[  
         {  
            "codeValue":"12345",
            "distance":[  
               {  
                  "5":"a c"
               },
               {  
                  "2":"z c"
               }
            ]
         },
         {  
            "codeValue":"60089",
            "distance":[  
               {  
                  "5":"a c"
               },
               {  
                  "2":"z c"
               }
            ]
         }
      ]
   }
}

我正在尝试使用以下代码打印zip 大小。

public void getJsonResponse() throws Exception {
    String text = getTheData();
    System.out.println(text);
    ObjectMapper objMap = new ObjectMapper();
    Map<String, Object> map = objMap.readValue(text, new TypeReference<Map<String, Object>>() {
    });

    String mainMap = map.get("product").toString();
    String getData = map.get("data").toString();
    Map<String, Object> map1 = objMap.readValue(getData, new TypeReference<Map<String, Object>>() {
    });
    List zip = (List) map1.get("zip");
    System.out.println(zip.size());
}

这里而不是 zip.size() 上的 sysout,如果我使用 mainMap,我得到的输出为 Data,但是当我使用 zip.size() 时,我得到一些异常为

线程“主”com.fasterxml.jackson.core.JsonParseException 中的异常:意外字符('z'(代码 122)):期望用双引号来开始字段名称 在 [来源:java.io.StringReader@60f82f98;行:1,列:3] 在 com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1524) 在 com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:557) 在 com.fasterxml.jackson.core.base.ParserMinimalBase._reportUnexpectedChar(ParserMinimalBase.java:475) 在 com.fasterxml.jackson.core.json.ReaderBasedJsonParser._handleOddName(ReaderBasedJsonParser.java:1293) 在 com.fasterxml.jackson.core.json.ReaderBasedJsonParser._parseName(ReaderBasedJsonParser.java:1190) 在 com.fasterxml.jackson.core.json.ReaderBasedJsonParser.nextToken(ReaderBasedJsonParser.java:612) 在 com.fasterxml.jackson.databind.deser.std.MapDeserializer._readAndBindStringMap(MapDeserializer.java:412) 在 com.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:312) 在 com.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:26) 在 com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2993) 在 com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2105) 在 onlyJava.JsonDataCAll.getJsonResponse(JsonDataCAll.java:24) 在 onlyJava.Test.main(Test.java:13)

请让我知道我哪里出错了,我该如何解决这个问题。

【问题讨论】:

    标签: java json jackson


    【解决方案1】:
    String getData = map.get("data").toString();
    

    这不会向您返回 JSON,因此不会返回异常。你会得到类似 {zip=[{...

    改为将您的陈述从

    Map<String, Object> map1 = objMap.readValue(getData, new TypeReference<Map<String, Object>>() {
            });
    

    Map<String, Object> map1 = (Map<String, Object>) map.get("data");
    

    【讨论】:

    • 我有一个小问题,我怎样才能得到"codeValue": "12345", "distance": 5 的值?
    • 您的列表是一个列表>。所以你可以做类似 Map map2 =(Map) zip.get((INDEX HERE); 而不是 map2.get("codeValue")。同样 map2.get("distance") ; 会给你一个列表。比列表又是一张地图,该地图的关键是你的距离,即“5”
    • 嘿,最后一件事,我怎样才能在 for(type var: var) 循环中做到这一点?
    • 抱歉,我没有收到问题。拉链或距离上的循环?
    • 在 zip 上,基本上我希望我的解决方案是输入 zip 和距离的地方,首先会有一个 zip 循环,然后是一个距离循环,然后返回答案跨度>
    【解决方案2】:

    您进行了可以跳过的转化。试试这个:

    Map data = (Map) map.get("data");
    List zip = (List) data.get("zip");
    System.out.println(zip.size());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-04
      • 2012-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多