对JSONObject中的数据进行排序

示例json字符串的格式以下:
{
     "data": {
     "sort": {
      "fields": [
        "open_px",
        "last_px",
        "high_px",
        "low_px"
      ],
      "603018.SS": [
        61.97,
        60.47,
        62.89,
        60.28
      ],
      "600990.SS": [
        62.8,
        59.99,
        62.88,
        59.36
      ],
      }
     }
    }
具体步骤:
JSONObject object  = new JSONObject(jsonStr);
		for (int i = 0; i < object.names().length(); i++) {
			JSONArray array = object.getJSONArray(object.names().getString(i));
			Double open_px = array.getDouble(0);
			Double last_px = array.getDouble(1);
			Double high_px = array.getDouble(2);
			Double low_px = array.getDouble(3);
			Entity entity = new Entity(open_px,last_px,high_px,low_px);
			mList.add(entity);
		}
		SortComparator comparator = new SortComparator();
		Collections.sort(mList, comparator);

对于此JSONObject,开始我还并不知道如何解析,后来查了源代码才发现,JSONObject对象其实存在一个names()方法,经过此方法,能够获取到JSONObject中的key值,咱们再经过key值便可获取JSONArray中的数据。具体步骤:html

先建立一个ArrayList,用于保存Entity
java

private ArrayList<Entity> mList = new ArrayList<Entity>();
代码:
JSONObject object  = new JSONObject(jsonStr);
        for (int i = 0; i < object.names().length(); i++) {
            JSONArray array = object.getJSONArray(object.names().getString(i));
            Double open_px = array.getDouble(0);
            Double last_px = array.getDouble(1);
            Double high_px = array.getDouble(2);
            Double low_px = array.getDouble(3);
            Entity entity = new Entity(open_px,last_px,high_px,low_px);
            mList.add(entity);
        }
        SortComparator comparator = new SortComparator();
        Collections.sort(mList, comparator);
因为JSONObject的存储数据的方式与HashMap是同样的,也就是说,经过此方法,咱们取出来的数据它是不规则的,而若是想要获得一个按某个特定的规则来排序,则须要实现Comparator接口
class SortComparator implements Comparator{
        @Override
        public int compare(Object lhs, Object rhs) {
            // TODO Auto-generated method stub
            Entity entity1 = (Entity) lhs;
            Entity entity2 = (Entity) rhs;
            return (int)(entity2.getLast_px()-entity1.getLast_px());
        }    
    }
注:这里当中的Entity即为实体,用于存储咱们所获取的值,经过其中的某个值去定义本身的规则,而后排序。另外,需注意,当compare()返回为0时,没法进行排序。因此这也就涉及到一个问题,在实际的开发中,咱们会发现,服务器返回的数据有不少相近或相同的数据,那么他们就没法作到真正意义上的排序,由于咱们知道,当compare()返回0的时候,两者之间是没法排序的,那么就要对程序作相应的修改。
class SortComparator implements Comparator{
        @Override
        public int compare(Object lhs, Object rhs) {
            // TODO Auto-generated method stub
            Entity entity1 = (Entity) lhs;
            Entity entity2 = (Entity) rhs;
            if(entity2.getLast_px()-entity1.getLast_px()>=0){
                return 1;
            }else {
                return -1;
            }
        }
    }
经过上面的方式修改,咱们发现,不让其返回为0的状况,便可完成全部的排序。这样也就达到了咱们的要求。至此,JSONObject的排序完成。