首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对JSONArray of JSONObjects进行排序

问如何对JSONArray of JSONObjects进行排序
EN

Stack Overflow用户
提问于 2012-10-15 18:27:40
回答 6查看 42K关注 0票数 26

我做了一个jsonobjects数组。现在,我需要根据来自sort对象的值对JSONArray进行排序。以前,我对自定义对象的ArrayLists进行了如下排序:

比较国:

代码语言:javascript
复制
public class KreeftenComparatorLA implements Comparator<Kreeft> {
    public int compare(Kreeft left, Kreeft right) {
        return left.latijnseNaam.compareTo(right.latijnseNaam);
    }
}
public class KreeftenComparatorNL implements Comparator<Kreeft> {
    public int compare(Kreeft left, Kreeft right) {
        return left.naam.compareTo(right.naam);
    }
}

然后对排列列表进行排序:

代码语言:javascript
复制
Collections.sort(db.lijst, new KreeftenComparatorLA());

或者:

代码语言:javascript
复制
Collections.sort(db.lijst, new KreeftenComparatorNL());

但是,当我像这样对JSONArray进行同样的尝试时(JA =我的jsonarray)

代码语言:javascript
复制
Collections.sort(JA, new KreeftenComparatorNL());

Collections.sort提供了一个错误:

类型集合中的方法排序(列表、比较器)不适用于参数(JSONArray、ThisActicity.KreeftenComparatorNL)

有人知道如何对JSONArray?进行排序吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-10-15 19:55:18

问题是JSONArray或多或少地持有JSONObjects (和其他JSONArrays),这最终是字符串。将字符串完全反序列化为POJO,对这些字符串进行排序,然后返回到JSON中是相当繁重的。

第二个问题是,JSONArray可以包含:布尔值、JSONArray、JSONObject、Number、String或JSONObject.NULL对象;也就是说,它是混合类型,因此很难将元素转储到某种类型和排序的列表中,然后通过列表转储排序的项返回到JSON数组中。从JSONArray获取每个元素的公共类型的唯一特定方法是使用Object get()方法。当然,您所拥有的只是对象对象,如果不重新查看序列化问题,就无法对它们进行任何有意义的排序。

假设您的JSONArray包含结构一致的值,您可以遍历JSONArray,在每个方法上调用一个类型化的get()方法,将它们转储到一个列表类型中,然后对其进行排序。如果您的JSONArray只包含“简单”类型,如字符串或数字,这是相对容易的。这不是确切的代码,但类似于:

代码语言:javascript
复制
List<String> jsonValues = new ArrayList<String>();
for (int i = 0; i < myJsonArray.length(); i++)
   jsonValues.add(myJsonArray.getString(i));
Collections.sort(jsonValues);
JSONArray sortedJsonArray = new JSONArray(jsonValues);

当然,如果您有嵌套对象,这可能会变得更加棘手。如果您希望在顶层进行排序的值,它可能并不坏.

代码语言:javascript
复制
List<JSONObject> jsonValues = new ArrayList<JSONObject>();
for (int i = 0; i < myJsonArray.length(); i++)
   jsonValues.add(myJsonArray.getJSONObject(i));

然后使用这样的比较器进行排序:

代码语言:javascript
复制
class JSONComparator implements Comparator<JSONObject>
{

    public int compare(JSONObject a, JSONObject b)
    {
        //valA and valB could be any simple type, such as number, string, whatever
        String valA = a.get("keyOfValueToSortBy");
        String valB = b.get("keyOfValueToSortBy");

        return valA.compareTo(valB);
        //if your value is numeric:
        //if(valA > valB)
        //    return 1;
        //if(valA < valB)
        //    return -1;
        //return 0;    
    }
}

同样,这也对JSONArray中数据的同质性做出了一些假设。如果可能的话,调整一下你的情况。此外,您还需要添加您的异常处理等。愉快的编码!

基于注释的编辑

票数 41
EN

Stack Overflow用户

发布于 2012-10-31 20:47:33

为了填补一个安卓列表ArrayAdapter,我需要这样做。我就是这样做的:

从JSONArray构建列表的活动代码:

代码语言:javascript
复制
JSONArray kids = node.getJSONArray("contents");
kids = JSONUtil.sort(kids, new Comparator(){
   public int compare(Object a, Object b){
      JSONObject    ja = (JSONObject)a;
      JSONObject    jb = (JSONObject)b;
      return ja.optString("name", "").toLowerCase().compareTo(jb.optString("name", "").toLowerCase();
   }
});
// in my case I wanted the original larger object contents sorted...
node.put("contents", kids);

在JSONUtil (我的助手)中:

代码语言:javascript
复制
public static JSONArray sort(JSONArray array, Comparator c){
    List    asList = new ArrayList(array.length());
    for (int i=0; i<array.length(); i++){
      asList.add(array.opt(i));
    }
    Collections.sort(asList, c);
    JSONArray  res = new JSONArray();
    for (Object o : asList){
      res.put(o);
    }
    return res;
}
票数 10
EN

Stack Overflow用户

发布于 2012-10-24 19:31:08

仅仅为了清除排序比较器上面的代码是不正确的。在Ruby这样的语言中,您不能像上面那样比较字符串。这可以写得更简洁,如下所示。否则,逻辑是合理的。

代码语言:javascript
复制
Collections.sort( jsonValues, new Comparator<JSONObject>() {
    @Override
    public int compare(JSONObject a, JSONObject b) {
        String valA = new String();
        String valB = new String();

        try {
            valA = (String) a.get("keyOfValueToSortBy");
            valB = (String) b.get("keyOfValueToSortBy");
        } 
        catch (JSONException e) {
            Log.e(LOG_TAG, "JSONException in combineJSONArrays sort section", e);
        }

        return valA.compareTo(valB);
    }
});
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12901742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档