Reading value of nested key in JSON with Java (Jackson)

后端 未结 4 1018
无人及你
无人及你 2020-12-28 14:12

I\'m a new Java programmer coming from a background in Python. I have weather data that\'s being collected/returned as a JSON with nested keys in it, and I don\'t understand

相关标签:
4条回答
  • 2020-12-28 14:35

    Try jpath API. It's xpath equivalent for JSON Data. You can read data by providing the jpath which will traverse the JSON data and return the requested value.

    This Java class is the implementation as well as it has example codes on how to call the APIs.

    https://github.com/satyapaul/jpath/blob/master/JSONDataReader.java

    Readme -

    https://github.com/satyapaul/jpath/blob/master/README.md

    Example:

    JSON Data:

    {
        "data": [{
            "id": "13652355666_10154605514815667",
            "uid": "442637379090660",
            "userName": "fanffair",
            "userFullName": "fanffair",
            "userAction": "recommends",
            "pageid": "usatoday",
            "fanPageName": "USA TODAY",
            "description": "A missing Indonesian man was found inside a massive python on the island of Sulawesi, according to local authorities and news reports. ",
            "catid": "NewsAndMedia",
            "type": "link",
            "name": "Indonesian man swallowed whole by python",
            "picture": "https:\/\/external.xx.fbcdn.net\/safe_image.php?d=AQBQf3loH5-XP6hH&w=130&h=130&url=https%3A%2F%2Fwww.gannett-cdn.com%2F-mm-%2F1bb682d12cfc4d1c1423ac6202f4a4e2205298e7%2Fc%3D0-5-1821-1034%26r%3Dx633%26c%3D1200x630%2Flocal%2F-%2Fmedia%2F2017%2F03%2F29%2FUSATODAY%2FUSATODAY%2F636263764866290525-Screen-Shot-2017-03-29-at-9.27.47-AM.jpg&cfs=1&_nc_hash=AQDssV84Gt83dH2A",
            "full_picture": "https:\/\/external.xx.fbcdn.net\/safe_image.php?d=AQBQf3loH5-XP6hH&w=130&h=130&url=https%3A%2F%2Fwww.gannett-cdn.com%2F-mm-%2F1bb682d12cfc4d1c1423ac6202f4a4e2205298e7%2Fc%3D0-5-1821-1034%26r%3Dx633%26c%3D1200x630%2Flocal%2F-%2Fmedia%2F2017%2F03%2F29%2FUSATODAY%2FUSATODAY%2F636263764866290525-Screen-Shot-2017-03-29-at-9.27.47-AM.jpg&cfs=1&_nc_hash=AQDssV84Gt83dH2A",
            "message": "Akbar Salubiro was reported missing after he failed to return from harvesting palm oil.",
            "link": "http:\/\/www.usatoday.com\/story\/news\/nation-now\/2017\/03\/29\/missing-indonesian-man-swallowed-whole-reticulated-python\/99771300\/",
            "source": "",
            "likes": {
                "summary": {
                    "total_count": "500"
                }
            },
            "comments": {
                "summary": {
                    "total_count": "61"
                }
            },
            "shares": {
                "count": "4"
            }
        }]
    
    }
    

    Code snippet:

    String jPath = "/data[Array][1]/likes[Object]/summary[Object]/total_count[String]";
    
    String value = JSONDataReader.getStringValue(jPath, jsonData);
    
    0 讨论(0)
  • 2020-12-28 14:37

    Use Jsonpath

    Integer h = JsonPath.parse(json).read("$.response.repository.history", Integer.class);

    0 讨论(0)
  • 2020-12-28 14:46

    Check out Jackson's ObjectMapper. You can create a class to model your JSON then use ObjectMapper's readValue method to 'deserialize' your JSON String into an instance of your model class. And vice-versa.

    0 讨论(0)
  • 2020-12-28 14:58

    With Jackson's tree model (JsonNode), you have both "literal" accessor methods ('get'), which returns null for missing value, and "safe" accessors ('path'), which allow you to traverse "missing" nodes. So, for example:

    JsonNode root = mapper.readTree(inputSource);
    int h = root.path("response").path("history").getValueAsInt();
    

    which would return the value at given path, or, if path is missing, 0 (default value)

    But more conveniently, you can just use JSON pointer expression:

    int h = root.at("/response/history").getValueAsInt();
    

    There are other ways too, and often it is more convenient to actually model your structure as Plain Old Java Object (POJO). Your content could fit something like:

    public class Wrapper {
      public Response response;
    } 
    public class Response {
      public Map<String,Integer> features; // or maybe Map<String,Object>
      public List<HistoryItem> history;
    }
    public class HistoryItem {
      public MyDate date; // or just Map<String,String>
      // ... and so forth
    }
    

    and if so, you would traverse resulting objects just like any Java objects.

    0 讨论(0)
提交回复
热议问题