it-swarm.com.de

Wert des geschachtelten Schlüssels in JSON mit Java lesen

Ich bin ein neuer Java-Programmierer mit einem Hintergrund in Python. Ich habe Wetterdaten, die als JSON mit verschachtelten Schlüsseln erfasst/zurückgegeben werden, und ich kann nicht verstehen, wie die Werte in dieser Situation herausgezogen werden. Ich bin mir sicher, dass diese Frage schon einmal gestellt wurde, aber ich schwöre, dass ich viel gegoogelt habe und keine Antwort finde. Im Moment verwende ich json-simple, aber ich habe versucht, zu Jackson zu wechseln und konnte immer noch nicht herausfinden, wie das geht. Da Jackson/Gson die am häufigsten verwendeten Bibliotheken zu sein scheinen, würde ich gerne ein Beispiel mit einer dieser Bibliotheken sehen. Unten sehen Sie ein Beispiel der Daten, gefolgt von dem Code, den ich bisher geschrieben habe. 

{
    "response": {
        "features": {
            "history": 1
        }
     },
    "history": {
        "date": {
            "pretty": "April 13, 2010",
            "year": "2010",
            "mon": "04",
            "mday": "13",
            "hour": "12",
            "min": "00",
            "tzname": "America/Los_Angeles"
        },
        ...
    }
}

Hauptfunktion

public class Tester {

    public static void main(String args[]) throws MalformedURLException, IOException, ParseException {
        WundergroundAPI wu =  new WundergroundAPI("*******60fedd095");

        JSONObject json = wu.historical("San_Francisco", "CA", "20100413");

        System.out.println(json.toString());
        System.out.println();
        //This only returns 1 level. Further .get() calls throw an exception
        System.out.println(json.get("history"));
    }
}

Die Funktion 'historical' ruft eine andere Funktion auf, die ein JSONObject zurückgibt

public static JSONObject readJsonFromUrl(URL url) throws MalformedURLException, IOException, ParseException {

    InputStream inputStream = url.openStream();

    try {
        JSONParser parser = new JSONParser();
        BufferedReader buffReader = new BufferedReader(new InputStreamReader(inputStream, Charset.forName("UTF-8")));

        String jsonText = readAll(buffReader);
        JSONObject json = (JSONObject) parser.parse(jsonText);
        return json;
    } finally {
        inputStream.close();
    }
}
20
Jon.H

Mit dem Baummodell von Jackson (JsonNode) haben Sie sowohl "wörtliche" Zugriffsmethoden ("get"), die null für fehlende Werte zurückgeben, als auch "sichere" Zugriffsmethoden ("path"), mit denen Sie "fehlende" Knoten durchqueren können. Also zum Beispiel:

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

welcher den Wert am angegebenen Pfad zurückgeben würde, oder, falls der Pfad fehlt, 0 (Standardwert)

Bequemer können Sie jedoch den JSON-Zeigerausdruck verwenden:

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

Es gibt auch andere Möglichkeiten, und oft ist es praktischer, Ihre Struktur tatsächlich als einfaches altes Java-Objekt (POJO) zu modellieren. Ihr Inhalt könnte etwa so aussehen:

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
}

in diesem Fall würden Sie die resultierenden Objekte wie alle Java-Objekte durchlaufen.

51
StaxMan

Verwenden Sie Jsonpath

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

4
Atmaram

Schauen Sie sich Jacksons ObjectMapper an. Sie können eine Klasse erstellen, um Ihre JSON zu modellieren, und anschließend die readValue-Methode von ObjectMapper verwenden, um Ihren JSON-String in eine Instanz der Modellklasse zu deserialisieren. Und umgekehrt.

1
Neil Davis

Versuchen Sie die jpath-API. Es ist Xpath-Äquivalent für JSON-Daten. Sie können Daten lesen, indem Sie den jpath angeben, der die JSON-Daten durchläuft und den angeforderten Wert zurückgibt.

Diese Java-Klasse ist die Implementierung sowie Beispielcodes zum Aufrufen der APIs.

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

Readme -

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

Beispiel:

JSON-Daten:

{
    "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-Auszug:

String jPath = "/data[Array][1]/likes[Object]/summary[Object]/total_count[String]";

String value = JSONDataReader.getStringValue(jPath, jsonData);
0
Satyajit Paul