Soru Gson kullanarak iç içe JSON ayrıştır


{
    "Response": {
        "MetaInfo": {
            "Timestamp": "2011-11-21T14:55:06.556Z"
        },
        "View": [
            {
                "_type": "SearchResultsViewType",
                "ViewId": 0,
                "Result": [
                    {
                        "Relevance": 0.56,
                        "MatchQuality": {
                            "Country": 1,
                            "State": 1,
                            "County": 1,
                            "City": 1,
                            "PostalCode": 1
                        },
                        "Location": {
                            "LocationType": "point",
                            "DisplayPosition": {
                                "Latitude": 50.1105,
                                "Longitude": 8.684
                            },
                            "MapView": {
                                "_type": "GeoBoundingBoxType",
                                "TopLeft": {
                                    "Latitude": 50.1194932,
                                    "Longitude": 8.6699768
                                },
                                "BottomRight": {
                                    "Latitude": 50.1015068,
                                    "Longitude": 8.6980232
                                }
                            },
                            "Address": {
                                "Country": "DEU",
                                "State": "Hessen",
                                "County": "Frankfurt am Main",
                                "City": "Frankfurt am Main",
                                "District": "Frankfurt am Main",
                                "PostalCode": "60311",
                                "AdditionalData": [
                                    {
                                        "value": "Germany",
                                        "key": "CountryName"
                                    }
                                ]
                            }
                        }
                    }
                ]
            }
        ]
    }
}

Yukarıdaki JSON'dan posta kodunu almaya çalışıyorum. Onu ayrıştırmak için gson kullanıyorum. Ben JSON için çok yeni ve burada tüm bu yazılardan okuduklarımdan (bazıları buna çok benzer), alanların olduğu gibi olması gerektiğini anladım. Yani anlıyorum, 4 sınıf vize Yanıt, görüş, Sonuç ve Adres yapmak zorundayım. Statik iç içe geçmiş sınıflar yaptım, ama sadece çıktı olarak boş değer elde ediyorum. Bir sonraki JSON'da birden çok adresim var. Ama bu tek cevapta sıkışıp kaldım.

Kısa bir örnek için, bu kodu kullanarak Zaman Damgası'nı almaya çalışıyorum, ama bana boş bir değer veriyor

public class ParseJSON {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new FileReader("try.json"));

        Gson gson = new GsonBuilder().create();
        Pojo pojo = gson.fromJson(br,Pojo.class);
        System.out.println(Pojo.Response.MetaInfo.Timestamp);
        br.close();
    }
}

class Pojo {
    public Pojo() { }

    static class Response{
        static class MetaInfo {
            static public String Timestamp;

            public String getTimestamp() {
                    return Timestamp;
            }
        }
    }
}

32
2017-11-22 20:41


Menşei


Bununla uğraşıyorum, eğer birisi bana yardım ederse takdir edeceğim. - RFT


Cevaplar:


Sadece ihtiyacın varsa "PostalCode", kullanabilirsin JsonParser bir grup sınıfa sahip olmak yerine:

JsonParser jsonParser = new JsonParser();
JsonObject address = jsonParser.parse(json)
    .getAsJsonObject().get("Response")
    .getAsJsonObject().getAsJsonArray("View").get(0)
    .getAsJsonObject().getAsJsonArray("Result").get(0)
    .getAsJsonObject().get("Location")
    .getAsJsonObject().getAsJsonObject("Address");
String postalCode = address.get("PostalCode").getAsString();

veya tüm sonuçlar için:

JsonArray results = jsonParser.parse(json)
        .getAsJsonObject().get("Response")
        .getAsJsonObject().getAsJsonArray("View").get(0)
        .getAsJsonObject().getAsJsonArray("Result");
for (JsonElement result : results) {
    JsonObject address = result.getAsJsonObject().get("Location").getAsJsonObject().getAsJsonObject("Address");
    String postalCode = address.get("PostalCode").getAsString();
    System.out.println(postalCode);
}

43
2017-11-22 21:34



Teşekkürler çalıştı. Ayrıca merak ettim, bu da birden çok Adres için çalışmalı, değil mi? - RFT
@sid: Harika. Birden çok sonuç mu demek istiyorsun? Üzerinde yineleyebilirsin getAsJsonArray("Result") anlatmak istediğin bu. - jeha
evet, adresleri içeren dizilerim var ve tüm adreslerden posta koduna ihtiyacım var. GetAsJsonArray ("Sonuç") üzerinde yinelemekle neyi kastettiğinizi tam olarak anlamadım. - RFT
@sid: Iterate ile ne demek istediğimi göstermek için cevabımı güncelledim - jeha
Gson ayrıştırma için web üzerinde mevcut en iyi örneklerden biri. Teşekkürler! - Signcodeindie


Zaman damgası örneğinizin çalışması için şunu deneyin:

public class ParseJSON {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new FileReader("try.json"));

        Gson gson = new GsonBuilder().create();
        Pojo pojo = gson.fromJson(br, Pojo.class);

        System.out.println(pojo.Response.MetaInfo.Timestamp);
        br.close();
    }
}

class Pojo {
    Response Response = new Response();
}

class Response {
    MetaInfo MetaInfo = new MetaInfo();
}

class MetaInfo {
    String Timestamp;
}

10
2017-11-22 21:54



Daha önce benzer bir şeyi denedim, hala boş görünüyor! - RFT
@sid: yaptın Pojo... değil pojo... - lütfen bunu dene - benim için çalışıyor ve senin için de olmalı - jeha
Bu soru diğerine göre en uygun cevaptır. - Dinesh Devkota