Java 使用gson解析嵌套的JSON
我试图从上面的JSON中检索邮政编码。我正在使用gson来解析它。我对JSON非常陌生,从我在这里的所有帖子(有些帖子与此非常类似)中读到的内容来看,我理解字段名称应该保持原样。所以我知道我必须做4个类,即响应、视图、结果和地址。我使它们成为静态嵌套类,但我只得到空值作为输出。在下一个JSON中,我有多个地址。但我被这个单一的回答所困扰 举个简单的例子,我试图用这段代码检索时间戳,但它给了我一个空值Java 使用gson解析嵌套的JSON,java,json,gson,Java,Json,Gson,我试图从上面的JSON中检索邮政编码。我正在使用gson来解析它。我对JSON非常陌生,从我在这里的所有帖子(有些帖子与此非常类似)中读到的内容来看,我理解字段名称应该保持原样。所以我知道我必须做4个类,即响应、视图、结果和地址。我使它们成为静态嵌套类,但我只得到空值作为输出。在下一个JSON中,我有多个地址。但我被这个单一的回答所困扰 举个简单的例子,我试图用这段代码检索时间戳,但它给了我一个空值 { "Response": { "MetaInfo": {
{
"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"
}
]
}
}
}
]
}
]
}
}
如果您只需要
“PostalCode”
,则可以使用JsonParser
,而不是使用一堆类:
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;
}
}
}
}
或对于所有结果:
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();
要使时间戳示例正常工作,请尝试:
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);
}
我正在努力解决这个问题,如果有人能帮助我,我会很感激的。谢谢你,它成功了。还有,我很好奇,这应该也适用于多个地址,对吗?@sid:太好了。你是说多重结果?您可以迭代
getAsJsonArray(“结果”)
这就是您的意思。是的,我有一些项目是包含地址的数组,我需要所有地址的邮政编码。我不太明白迭代getAsJsonArray(“Result”)是什么意思。@sid:我更新了我的答案,以演示我所说的迭代是什么意思,这是web上用于Gson解析的最佳示例之一。谢谢@希德:你做了Pojo…
而不是Pojo…
-请试试这一个-它对我有效,也应该对你有效这是对问题最合适的答案。
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;
}