Android 解析JSON,然后向ArrayList添加多个字符串
目前正在开发一个应用程序,该应用程序获取搜索结果,解析返回的JSON对象,然后将结果片段添加到名为Android 解析JSON,然后向ArrayList添加多个字符串,android,json,parsing,rest,Android,Json,Parsing,Rest,目前正在开发一个应用程序,该应用程序获取搜索结果,解析返回的JSON对象,然后将结果片段添加到名为VenueList的类中的几个ArrayLists 下面是从服务接收结果并解析JSON的方法: private static List<String> getResultsFromJson(String json) { ArrayList<String> resultList = new ArrayList<String>();
VenueList
的类中的几个ArrayLists
下面是从服务接收结果并解析JSON的方法:
private static List<String> getResultsFromJson(String json) {
ArrayList<String> resultList = new ArrayList<String>();
try {
JSONObject resultsWrapper = (JSONObject) new JSONTokener(json).nextValue();
JSONArray results = resultsWrapper.getJSONArray("results");
for (int i = 0; i < results.length(); i++) {
JSONObject result = results.getJSONObject(i);
resultList.add(result.getString("text"));
}
}
catch (JSONException e) {
Log.e(TAG, "Failed to parse JSON.", e);
}
return resultList;
}
我还将结果添加到名为VenueList
的类中,该类管理结果并使其可用于多个视图。它基本上只包含多个ArrayLists
,其中包含搜索中返回的每个地点的不同类型的详细信息。我用于将场地添加到VenueList
的方法如下(您可以在上面的for循环中看到它的用法):
我希望addVenue
方法能够接受多个参数并更新VenueList
类。然而,当我在for循环中调用addVenue
方法时,我只能传递String result
(来自循环的参数),并且不知道如何传递第二个参数(也应该来自getResultsFromJson
解析的JSON),所以我使用了“HELLO WORLD”
暂时用作占位符
我意识到getResultsFromJson
只返回了一个列表。我需要能够从我解析的JSON对象中获取多个元素,然后以正确的顺序将它们添加到VenueList中
因此,我的问题是:
1) 给定getResultsFromJson
方法和for
循环,我如何使用设计好的addVenue()
方法?如何解析JSON中的多个元素,然后同时将它们添加到VenueList?我计划以后再给它添加更多的参数,但我假设如果我能用两个参数,我就能用四个或五个参数
2) 如果这是不可能的,那么应该如何重新设计getResultsFromJson
、for
循环和addVenue
方法才能正常工作
请让我知道,如果你需要更多的细节或代码-乐意提供。谢谢大家!
编辑-完整的VenueList类:
public class VenueList {
private static ArrayList<String> venueNames;
private static ArrayList<String> venueGeos;
public VenueList() {
venueNames = new ArrayList<String>();
venueGeos = new ArrayList<String>();
}
public static void addVenue(String name, String geo) {
venueNames.add(name);
venueGeos.add(geo);
}
public static String getVenueName(int position) {
return venueNames.get(position);
}
public static String getVenueGeo(int position) {
return venueGeos.get(position);
}
public static void clearList() {
venueNames.clear();
venueGeos.clear();
}
}
public-class-VenueList{
私有静态阵列列表venueNames;
私有静态阵列列表Venuegos;
公共静脉列表(){
VenuNames=新的ArrayList();
venueGeos=新的ArrayList();
}
公共静态void addvice(字符串名称、字符串地理位置){
添加(名称);
添加(地理位置);
}
公共静态字符串GetVenuName(int位置){
返回venueNames.get(位置);
}
公共静态字符串getVenueGeo(int位置){
返回Venuegos.get(位置);
}
公共静态void clearList(){
维努奈姆斯。克利尔();
venueGeos.clear();
}
}
澄清:对于我要存储的关于某个地点(电话号码、地址等)的每个数据元素,我都会有额外的ArrayList。1)我认为getResultsFromJson(String json)和AddVince(String name、String geo)方法不适合您的需要
2)我会考虑重写方法GETRESULTS从JSON(String JSON)到这样的事情:
private static SortedMap<Integer, List<String>> getResultsFromJson(String json) {
Map<Integer, String> resultMap = new TreeMap<Integer, String>();
//...
return resultMap;
}
// grab your retuned map and get an entrySet, the just iterate trough it
SortedMap<Integer, String> result = returnedMap.entrySet();
for (Entry<Integer, String> result : entrySet) {
Integer key = result.getKey(); // use it if you need it
List<String> yourDesiredItems = result.getValue(); // explicitly shown to know how to get it
VenueList.addVenue(yourDesiredItems);
}
public static void addVenue(List<String> yourDesiredItems) {
// refactor here to iterate the items trough the list and save properly
//....
}
private static void getResultsFromJson(String json) {
try {
JSONObject resultsWrapper = (JSONObject) new JSONTokener(json).nextValue();
JSONArray results = resultsWrapper.getJSONArray("results");
for (int i = 0; i < results.length(); i++) {
JSONObject result = results.getJSONObject(i);
//FOR EXAMPLE HERE IS WHERE YOU NEED TO EXTRACT INFO
String name = result.getString("name");
String geo = result.getString("geo");
// and then...
VenueList.addVenue(name, geo, ..., etc);
}
} catch (JSONException e) {
Log.e(TAG, "Failed to parse JSON.", e);
}
}
List<Venue> myListOfVenues = new ArrayList<Venue>();
for (int i = 0; i < results.length(); i++) {
JSONObject result = results.getJSONObject(i);
// THIS WOULD REMAIN THE SAME TO EXTRACT INFO
String name = result.getString("name");
String geo = result.getString("geo");
// and then instead of calling VenueList.addVenue(name, geo, ..., etc)...
Venue v = new Venue();
v.setName(name);
v.setGeo(geo);
// ...etc
myListOfVenues.add(v);
}
// Once you're done, set that List to VenueList class
VenueList.setVenueList(myListOfVenues);
这意味着您的addvinge
方法应该知道接收所需的所有参数;正如你所看到的,这只是一种方式(你可以考虑一个解决方案来满足你的需求),但是,因为我不知道所有的要求,导致你对这个模型进行编码,我将指出一些你可以考虑的事情:
< > >强> 1。< /强>如果<代码> Vuuelist< <代码>类使用所有静态的,请考虑这样做:
然后,如果您需要VenueList
类,您将只拥有一个场地对象的列表(list)
,这意味着您将首先创建一个全新的Venue
类实例,并调用每个特征的setter方法,而不是调用方法addVenue
,作为我提供的变通方法中重构for循环的一个示例,您将使用以下内容:
private static SortedMap<Integer, List<String>> getResultsFromJson(String json) {
Map<Integer, String> resultMap = new TreeMap<Integer, String>();
//...
return resultMap;
}
// grab your retuned map and get an entrySet, the just iterate trough it
SortedMap<Integer, String> result = returnedMap.entrySet();
for (Entry<Integer, String> result : entrySet) {
Integer key = result.getKey(); // use it if you need it
List<String> yourDesiredItems = result.getValue(); // explicitly shown to know how to get it
VenueList.addVenue(yourDesiredItems);
}
public static void addVenue(List<String> yourDesiredItems) {
// refactor here to iterate the items trough the list and save properly
//....
}
private static void getResultsFromJson(String json) {
try {
JSONObject resultsWrapper = (JSONObject) new JSONTokener(json).nextValue();
JSONArray results = resultsWrapper.getJSONArray("results");
for (int i = 0; i < results.length(); i++) {
JSONObject result = results.getJSONObject(i);
//FOR EXAMPLE HERE IS WHERE YOU NEED TO EXTRACT INFO
String name = result.getString("name");
String geo = result.getString("geo");
// and then...
VenueList.addVenue(name, geo, ..., etc);
}
} catch (JSONException e) {
Log.e(TAG, "Failed to parse JSON.", e);
}
}
List<Venue> myListOfVenues = new ArrayList<Venue>();
for (int i = 0; i < results.length(); i++) {
JSONObject result = results.getJSONObject(i);
// THIS WOULD REMAIN THE SAME TO EXTRACT INFO
String name = result.getString("name");
String geo = result.getString("geo");
// and then instead of calling VenueList.addVenue(name, geo, ..., etc)...
Venue v = new Venue();
v.setName(name);
v.setGeo(geo);
// ...etc
myListOfVenues.add(v);
}
// Once you're done, set that List to VenueList class
VenueList.setVenueList(myListOfVenues);
List myListOfVenues=new ArrayList();
对于(int i=0;i
所以
VenueList
类现在将拥有一个属性List-VenueList
会在方法GetVenuName等方面遇到一些小麻烦。
一切都会变得更可读。。。我希望这能帮助您找到另一种解决问题的方法,如果我仍然没有提出我的观点,请告诉我,我会尽力帮助您解决…谢谢。有没有办法在getResultsFromJson中保存到VenueList,而不是使用映射作为中间人?您当然可以在getResultsFromJson方法上重构(int i=0;i