Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 解析JSON,然后向ArrayList添加多个字符串_Android_Json_Parsing_Rest - Fatal编程技术网

Android 解析JSON,然后向ArrayList添加多个字符串

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>();

目前正在开发一个应用程序,该应用程序获取搜索结果,解析返回的JSON对象,然后将结果片段添加到名为
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,然后,您可以更改AddVince签名以接受设置一次的所有参数,或者只需使用VenueListClass的setter方法,提供有关VenueList类的更多信息,这样我可以更好地帮助您,如果我不清楚,请让我知道,这样我就可以发布一个示例来更新我的答案。我认为这很有意义,但我对这方面的知识还很陌生,所以举个例子会很有帮助,非常感谢。我认为最好避免使用地图,因为它们看起来就像一个中间人,对吗?我在原始消息中发布了完整的VenueList类。我发布了一个新的编辑,展示了如何避免将地图作为中间人(考虑到这是可能的,只要你不需要其他地方的地图),ho