json - 如何使用 Jackson API(列表中的列表)迭代 JSON 响应?

标签 json jackson

如何使用 Jackson API 在 Java 中迭代 JSON 响应?换句话说,如果响应有一个列表并且在该列表中是另一个列表(在本例中称为“天气”),则 我如何获得温度 ?

这是我尝试迭代的示例:

{
   "message":"like",
   "cod":"200",
   "count":3,
   "list":[
      {
         "id":2950159,
         "name":"Berlin",
         "coord":{
            "lon":13.41053,
            "lat":52.524368
         },
         "weather":[
            {
               "id":804,
               "main":"Clouds",
               "description":"overcast clouds",
               "temp":74
            }
         ]
      },
      {
         "id":2855598,
         "name":"Berlin Pankow",
         "coord":{
            "lon":13.40186,
            "lat":52.56926
         },
         "weather":[
            {
               "id":804,
               "main":"Clouds",
               "description":"overcast clouds",
               "temp":64
            }
         ]
      }
   ]
}

这是我尝试使用的代码,它不起作用,因为我只能遍历第一项:
try {                
    JsonFactory jfactory = new JsonFactory();
    JsonParser jParser = jfactory.createJsonParser( new File("test.json") );

    // loop until token equal to "}"
    while ( jParser.nextToken() != JsonToken.END_OBJECT ) {

        String fieldname = jParser.getCurrentName();

        if ( "list".equals( fieldname ) ) { // current token is a list starting with "[", move next                 
        jParser.nextToken();                                  
        while ( jParser.nextToken() != JsonToken.END_ARRAY ) {
            String subfieldname = jParser.getCurrentName();
            System.out.println("- " + subfieldname + " -");
            if ( "name".equals( subfieldname ) ) {
                jParser.nextToken();
                System.out.println( "City: " + jParser.getText() );                         }        
            }            
        }

        }
        jParser.close();

        } catch (JsonGenerationException e) {        
            e.printStackTrace();         
        } catch (JsonMappingException e) {       
         e.printStackTrace();        
        } catch (IOException e) {        
         e.printStackTrace();        
        }
        System.out.println("-----------------");

最佳答案

当 jackson 打算为您解析时,您正在解析 JSON。不要对自己这样做。
一种选择是创建一个与您的 JSON 格式匹配的 DTO ( Data Transfer Object )

class Root {
    private String message;
    private String cod;
    private int count;
    private List<City> list;
    // appropriately named getters and setters
}

class City {
    private long id;
    private String name;
    private Coordinates coord;
    private List<Weather> weather;
    // appropriately named getters and setters
}

class Coordinates {
    private double lon;
    private double lat;
    // appropriately named getters and setters
}

class Weather {
    private int id;
    private String main;
    private String description;
    private int temp;
    // appropriately named getters and setters
}
然后使用 ObjectMapper并反序列化 JSON 的根。
ObjectMapper mapper = new ObjectMapper();
Root root = mapper.readValue(yourFileInputStream, Root.class);
然后你可以得到你想要的字段。例如
System.out.println(root.getList().get(0).getWeather().get(0).getTemp());
打印
74
另一种方法是将您的 JSON 读入 JsonNode并遍历它,直到获得所需的 JSON 元素。例如
JsonNode node = mapper.readTree(new File("text.json"));
System.out.println(node.get("list").get(0).get("weather").get(0).get("temp").asText());
也打印
74

关于json - 如何使用 Jackson API(列表中的列表)迭代 JSON 响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20832015/

相关文章:

javascript - 如何在输入文本中设置唯一可能的值

json - Scala 创建多行 JSON 字符串

java - jackson :反序列化空字符串而不是预期对象时为 "Unexpected token (VALUE_STRING), expected FIELD_NAME:"

java - 如何使用 Spring MVC 从 API REST 获取对象

java - 如何在JAVA中从字符串(字符数组)中提取键值

android - 无法启动 Activity ComponentInfo :java. lang.RuntimeException:您的内容必须有一个 ListView,其 id 属性为 'android.R.id.list'

json - ESLINT:解析错误:package.json 中有意外的 token

java - 如何使用BeanSerializerModifier的changeProperties添加新的Property?

java - 泽西通用实体不工作

java - 在 Jackson 中创建一个空的数组列表