Android如何sortingJSONObjects的JSONArray

我做了一个jsonobjects jsonarray。 现在我需要根据jsonobjects中的值对JSONArray进行sorting。 以前我sorting自定义对象ArrayLists像这样:

比较:

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

然后对数组列表进行sorting:

 Collections.sort(db.lijst, new KreeftenComparatorLA()); 

要么:

 Collections.sort(db.lijst, new KreeftenComparatorNL()); 

但是当我用这样的JSONArray尝试同样的事情(JA =我的jsonarray)

 Collections.sort(JA, new KreeftenComparatorNL()); 

Collections.sort给出了一个错误:

types集合中的方法sort(List,Comparator)不适用于参数(JSONArray,ThisActicity.KreeftenComparatorNL)

有谁知道如何sortingJSONArray?

Solutions Collecting From Web of "Android如何sortingJSONObjects的JSONArray"

问题是JSONArray或多或less拥有最终是string的JSONObjects(和其他JSONArray)。 将string完全反序列化为POJO,将它们sorting,然后回到JSON中相当重要。

第二个问题是JSONArray可以包含:Boolean,JSONArray,JSONObject,Number,String或JSONObject.NULL对象; 即它是混合types,使得将元素转储到某种types的List中并对其进行sorting很困难,然后通过列表转储sorting的项目回到JSON数组中。 从JSONArray中获取每个元素的通用types的唯一方法是使用Object get()方法。当然,您拥有的只是Object对象,如果不重新访问,将无法对其进行任何有意义的sorting序列化问题。

假设您的JSONArray包含同构的值,您可以遍历JSONArray,调用每个types的get()方法之一,将它们转储为Listtypes,然后对其进行sorting。 如果你的JSONArray只是像String或者数字一样拥有“简单”types,那么这相对容易一些。 这不是确切的代码,但像这样:

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

当然,如果你有嵌套的对象,这可能会有点棘手。 如果你想sorting的价值在顶层生活,它可能不是太糟糕…

 List<JSONObject> jsonValues = new ArrayList<JSONObject>(); for (int i = 0; i < myJsonArray.length(); i++) jsonValues.add(myJsonArray.getJSONObject(i)); 

然后使用这样的比较器来sorting:

 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中的数据的同质性​​做了一些假设。 尽可能调整你的情况。 你也需要添加你的exception处理等快乐的编码!

编辑根据评论固定

为了填补Android列表ArrayAdapter我需要做到这一点。 这是我做到的:

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

 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(我的帮手):

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

只是为了清楚上面的分类比较器的代码是不正确的。 像Ruby这样的语言,你不能像上面那样比较string。 这可以写得更简洁如下。 否则,逻辑是健全的。

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

Date字段的一个示例:

 public class JsonObjectComparator implements Comparator<JSONObject> { private final String fieldName; private Class<? extends Comparable> fieldType; public JsonObjectComparator(String fieldName, Class<? extends Comparable> fieldType) { this.fieldName = fieldName; this.fieldType = fieldType; } @Override public int compare(JSONObject a, JSONObject b) { String valA, valB; Comparable newInstance_valA, newInstance_valB; int comp = 0; try { Constructor<? extends Comparable> constructor = fieldType.getConstructor(String.class); valA = a.getString(fieldName); valB = b.getString(fieldName); if (fieldType.equals(Date.class)) { SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy"); newInstance_valA = dateFormat.parse(valA); newInstance_valB = dateFormat.parse(valB); } else { newInstance_valA = constructor.newInstance(valA); newInstance_valB = constructor.newInstance(valB); } comp = newInstance_valA.compareTo(newInstance_valB); } catch (Exception e) { System.out.println(e.getMessage()); } if(comp > 0) return 1; if(comp < 0) return -1; return 0; } } public static void main(String[] args) throws JSONException { JSONObject o1 = new JSONObject(); o1.put("key1", "26-06-2014"); JSONObject o2 = new JSONObject(); o2.put("key1", "30-11-2011"); JSONObject o3 = new JSONObject(); o3.put("key1", "15-07-2014"); JsonObjectComparator comparator = new JsonObjectComparator("key1", Date.class); List<JSONObject> l = new ArrayList<>(); l.add(o1); l.add(o2); l.add(o3); Collections.sort(l, comparator); } 

如果要显示JSONArray包含的数据,那么在适配器本身中sorting它可能是有意义的。 例如, ArrayAdapter<T>类已经有了必要的方法,比如InsertRemove ,当然还有Sort

 adapter.sort(new Comparator<JSONObject>(){ @Override public int compare(JSONObject arg0, JSONObject arg1) { return arg0.optString("SortField", "").compareTo(arg1.optString("SortField","")) ; } }); 
 //My script //HEADER add final variables private final int TYPE_STRING = 1; private final int TYPE_INT = 2; private final int TYPE_DUBLE = 3; //METHOD GET SORT JSONARRAY public JSONArray getSortJSONArray() { JSONArray json = new JSONArray ([{"carid":"957502","vin":"XXXXX","carbrand":"CADILLAC","carmodel":"CTS","carname":"CADILLAC CTS седан CTS PERFORMANC 2.0L AWD AK4 2 4WD AT-6 276 (Л.С.)","carmodificationname":" седан CTS PERFORMANC 2.0L AWD AK4 2 4WD AT-6 276 (Л.С.)","carcolorname":"Opulent Blue Metallic - ярко-синий металлик","price":"3410000","rgb":"","volumereal":"2,00","power":"276"},{"carid":"957502","vin":"XXXXX","carbrand":"CADILLAC","carmodel":"CTS","carname":"CADILLAC CTS седан CTS PERFORMANC 2.0L AWD AK4 2 4WD AT-6 276 (Л.С.)","carmodificationname":" седан CTS PERFORMANC 2.0L AWD AK4 2 4WD AT-6 276 (Л.С.)","carcolorname":"Opulent Blue Metallic - ярко-синий металлик","price":"3460000","rgb":"","volumereal":"1,00","power":"272"}]"); /*halper - My halper */ JSONArray sorJsonArray = halper.sort(json, getComparator("power",TYPE_INT)); return sorJsonArray; } private Comparator getComparator(final String tagJSON,final int type) { Comparator c = new Comparator() { public int compare(Object a, Object b) { try { JSONObject ja = (JSONObject)a; JSONObject jb = (JSONObject)b; switch (type) { case TYPE_STRING:// String return ja.optString(tagJSON, "") .toLowerCase() .compareTo(jb.optString(tagJSON, "").toLowerCase()); case TYPE_INT:// int int valA = ja.getInt(tagJSON); int valB = jb.getInt(tagJSON); if(valA > valB) return 1; if(valA < valB) return -1; case TYPE_DUBLE:// double String v1 = ja.getString(tagJSON).replace(",","."); String v2 = jb.getString(tagJSON).replace(",","."); double valAd = new Double(v1);// ja.getDouble(tagJSON); double valBd = new Double(v2);// jb.getDouble(tagJSON); if(valAd > valBd) return 1; if(valAd < valBd) return -1; } } catch (Exception e) { e.printStackTrace(); } return 0; } }; return c; } 

//我的Halper类

 public class Halpe { public void Halpe(){} 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; }}