我想从API中获取countynames,它返回嵌套对象;
"countries": {
"1": {
"name": "Cyprus",
"nameTurkish": "KKTC",
"nameNative": "Kıbrıs"
},
"2": {
"name": "Turkey",
"nameTurkish": "Türkiye",
"nameNative": "Türkiye"
},
"3": {
"name": "Monaco",
"nameTurkish": "Monako",
"nameNative": "Monaco"
},
等等,有200多个国家,每个县都有自己的“编号”。最后,我想列出所有“姓名”信息。我想我应该使用JsonDeserializer,但不幸的是我不能。
在这里,您可以看到您的数据看起来像HashMap
,因此我只是尝试了这种方法,您的数据解析成功,没有出现任何问题:
>
创建Pojo的:
public class Countries {
private HashMap<String, Country> countries;
public HashMap<String, Country> getCountries() { return countries; }
public void setCountries(HashMap<String, Country> countries) { this.countries = countries; }
}
public class Country {
private String name;
private String nameTurkish;
private String nameNative;
public String getName() { return name; }
public void setName(String name) { this.name = name;}
public String getNameTurkish() { return nameTurkish; }
public void setNameTurkish(String nameTurkish) { this.nameTurkish = nameTurkish; }
public String getNameNative() { return nameNative; }
public void setNameNative(String nameNative) { this.nameNative = nameNative; }
}
创建Gson对象并对其进行分析:
Gson gson = new Gson();
// Countries Object
Type testC = new TypeToken<Countries>(){}.getType();
Countries ob = gson.fromJson(test, testC);
String newData = gson.toJson(ob.getCountries());
System.out.println("New Data: "+newData);
// All country in HashMap
Type country = new TypeToken<HashMap<String, Country>>(){}.getType();
HashMap<String, Country> countryHashMap = gson.fromJson(newData, country);
// Print All HashMap Country
for (Map.Entry<String, Country> set : countryHashMap.entrySet()) {
System.out.println("==> "+set.getKey() + " = " + set.getValue());
}
输出:
I/System.out: ==> 1 = Country{name='Cyprus', nameTurkish='KKTC', nameNative='Kıbrıs'}
I/System.out: ==> 2 = Country{name='Turkey', nameTurkish='Türkiye', nameNative='Türkiye'}
I/System.out: ==> 3 = Country{name='Monaco', nameTurkish='Monako', nameNative='Monaco'}
尝试使用TypeToken。
Gson gson = new Gson();
List<Country> list = gson.fromJson(gson.toJson(what_you_get_data), new TypeToken<ArrayList<Country>>(){}.getType()); //Country is VO class what you make.
整个JSON响应可以被读取为一个JSONObject
,其中包含多个元素,您可以遍历这些元素并获取不同的数据。
String jsonResponse = ""; // Put the entire JSON response as a String
JSONObject root = new JSONObject(jsonResponse);
JSONArray rootArray = root.getJSONArray("countries"); // root element of the json respons
for (int i = 0; i < rootArray.length(); i++) {
JSONObject number = rootArray.getJSONObject(i);
String country = number.getString("name"); // Get country name
// Here you can add `country` into a List
}
更新:
但是我的JSON文件中没有数组,它们都是对象,每个国家都在一个对象中,每个对象都有自己的序列化名称
您可以将其读入JSONOjbect,而不是使用JSONArray,您可以如下所示迭代JSONObject的长度。
try {
JSONObject root = new JSONObject(jsonResponse);
JSONObject countries = root.getJSONObject("countries");
for (int i = 1; i <= countries.length(); i++) {
JSONObject number = countries.getJSONObject(String.valueOf(i));
String country = number.getString("name"); // Get country name
// Here you can add the `country` into a List
}
} catch (JSONException e) {
e.printStackTrace();
}
有什么方法可以创建一个Gson的自定义转换器来提取字段,从而使regetfit返回appipiate POJO吗?
问题内容: 我正在使用Android应用程序中的API,所有JSON响应均如下所示: 问题是,我所有的POJO有,字段,里面领域是真正的POJO我想要的。 有什么方法可以创建Gson的自定义转换器以始终提取字段,因此改造会返回适当的POJO? 问题答案: 您将编写一个自定义反序列化器,该反序列化器返回嵌入的对象。 假设您的JSON是: 然后,您将获得一个POJO: 然后编写一个反序列化器: 现在,
问题内容: 我正在使用Android应用程序中的API,所有JSON响应均如下所示: 问题是,我所有的POJO有,字段,里面领域是真正的POJO我想要的。 有什么方法可以创建Gson的自定义转换器来提取始终的字段,因此改造会返回适当的POJO? 问题答案: 你将编写一个自定义反序列化器,以返回嵌入式对象。 假设你的JSON是: 然后,你将获得一个ContentPOJO: 然后编写一个反序列化器:
问题内容: 我在下面的对象中尝试获取所有id值。 使用以下代码,我仅获得第一个id值。有没有办法从嵌套对象中获取所有id值,而无需使用任何外部模块。 预期产量 问题答案: 您可以使用如下所示的JavaScript函数来获取嵌套属性: 检查此小提琴以获取可行的解决方案。
问题内容: 我正在与集成的android应用程序上工作。我正在使用fql查询从Facebook获取信息。我的fql方法是 myjson对象具有我想要的所有信息。像这样 问题是如何将该信息存储到不同的阵列中? 请为此修改一些代码。 问题答案: 检查http://www.androidhive.info/2012/01/android-json-parsing- tutorial/
问题内容: 我正在尝试使用具有以下结构的Java中的gson解析一些JSON数据,但是通过在线查看示例,我找不到任何能完成此工作的东西。 有人可以协助吗? 问题答案: 您只需要创建一个Java类结构即可表示JSON中的数据。为了做到这一点,我建议您将JSON复制到此在线JSON Viewer中 ,您会发现JSON的结构更加清晰… 基本上,您需要这些类(伪代码): 请注意,您的类中的属性名称必须与J