0

目前正在开发一个应用程序,该应用程序从搜索中获取结果,解析返回的 JSON 对象,然后将结果片段添加到ArrayLists创建的名为VenueList.

下面是从服务接收结果并解析 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;
}

什么结果变成了一个List变量调用mResults(澄清:mResults = getResultsFromJson(restResult);。然后在以下循环中使用,其中包括将结果放入ArrayAdapter用于在 ListFragment 中显示它们的循环中:

for (String result : mResults) {    
    VenueList.addVenue(result, "HELLO WORLD"); 
    adapter.add(result);
}

我还将结果添加到一个名为的类中,该类VenueList管理结果并使它们可用于多个视图。它基本上只包含多个ArrayLists,其中包含搜索中返回的每个场所的不同类型的详细信息。我用来添加场地的VenueList方法如下(您可以在上面的 for 循环中看到它):

public static void addVenue(String name, String geo) {
    venueNames.add(name);
    venueGeos.add(geo);
}

我希望该addVenue方法能够接受多个参数并更新VenueList类。然而,当我addVenue在 for 循环中调用该方法时,我只能传递它String result(从循环的参数)并且无法弄清楚如何传递它的第二个参数(它也应该来自解析的 JSON getResultsFromJson)所以我"HELLO WORLD"现在用作占位符。

我意识到getResultsFromJson只有一个列表返回。我需要能够从我解析的 JSON 对象中获取多个元素,然后以正确的顺序将它们添加到 VenueList。

所以我的问题是:

1)给定getResultsFromJson方法和for循环,我该如何使用addVenue()设计的方法?如何解析 JSON 中的多个元素,然后将它们同时添加到 VenueList?我计划稍后为其添加更多参数,但我假设如果我可以让它与两个一起工作,我可以让它与四个或五个一起工作。

2)如果不可能,应该如何重新设计getResultsFromJsonfor循环和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();
}

}

说明:我将为要存储的有关场地(电话号码、地址等)的每个数据元素添加额外的 ArrayList

4

1 回答 1

0

1) 我认为 getResultsFromJson(String json) 和 addVenue(String name, String geo) 方法不适合您的需求。

2)我会考虑将方法 getResultsFromJson(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    

    //....
}

编辑——因为您希望避免中间映射,我假设您不需要从该方法返回任何内容

首先,我为您提供满足您要求的解决方案,然后我将为您提供一些提示,因为我看到了一些可以简化您的设计的东西。

要直接保存 VenueList 的内容,getResultsFromJSON请执行以下操作:

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

这意味着您的addVenue方法应该知道接收所有需要的参数;正如您所看到的,这只是一种方法(您可以考虑根据您的需求解决问题),但是由于我不知道导致您编写此模型的所有要求,我将指出您可能会考虑的一些事项:

1. 如果类有理由VenueList使用所有静态的东西,请考虑这样做:

static{
    venueNames = new ArrayList<String>();
    venueGeos = new ArrayList<String>();
    //....
}

private VenueList(){
}

这样您就不需要每次都获取一个实例,并且在没有先前实例化的情况下也null pointer exceptions可以避免VenueList.addVenue(...)

2. 考虑为类中的ArrayList每个特征VenueList定义一个model object,而不是Venue像这样定义一个:

public class Venue{
    String name;
    String geo;
    //... etc

    public Venue(){
    }

    // ... getters & setters
}

然后,如果您需要VenueList该类,您将只有一个 Venue 对象列表(List<Venue>),这意味着addVenue您将首先创建一个全新的Venue类实例,并调用每个特性的 setter 方法,而不是调用该方法,例如从我为您提供的解决方法重构 for 循环,您将使用如下内容:

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

所以VenueList类现在将有一个单一的属性List<Venue> venueList;,并且会在方法上遭受轻微的 tweeksgetVenueName, etc...并且一切都会更具可读性......我希望这可以帮助你找到另一种方法来解决你的问题,如果我仍然没有表达我的观点,请告诉我我会尽力帮助你...

于 2013-04-07T01:27:40.260 回答