如何在将值添加到JSONArray时保持值的顺序?

时间:2015-01-28 04:08:34

标签: java arrays json

我需要从对象列表中生成JSON。要做到这一点,我使用以下代码,但我有两个问题:

  1. 条目顺序变更
  2. 当我显示JSON时,它会在所有\之前添加"
  3. JSONObject jsonObj = new JSONObject();
    for (Row row : rows) {
        jsonObj.put(row.getCode(),row.getValue());
    
    }
    myJson.put(jsonObj.toString());
    System.err.println("myJson:" + myJson.toString());
    

    输出

    myJson:["{\"1234445\":\"Jack"}"]
    

    感谢Sotirios Delimanolis,在从jsonObj中删除.toString()后,第一个问题已经解决了。

2 个答案:

答案 0 :(得分:2)

你不能。

来自RFC 7159, section 4

  

已经观察到JSON解析库在是否存在时会有所不同      不是它们使对象成员的排序对调用可见      软件。行为不依赖于成员的实现      排序将是可互操作的,因为它们不会      受到这些差异的影响。

您的实施似乎是那些“可互操作”的实施之一;对象成员的顺序无关紧要。

这意味着它可以使用成员a,b,c序列化对象,以便将它们迭代为b,a,c;除了自己定制对象成员订单外,你无能为力。

答案 1 :(得分:2)

我们在项目中使用比较器来获取Json数组的顺序。 我发布的相同你只是根据你的元素使用你的数组。

GetSortedList是一个数组接受数组并返回已排序列表的方法。 @

               List<JsonElement> lJaArray = null;
               lJaArray = getSortedList( lJaArrayUnsorted ); // theJson    array you want to sort.

public static List getSortedList( JsonArray array ) throws JSONException { List list = new ArrayList(); for( int i = 0; i < array.size(); i++ ) { list.add( array.get( i ) ); } Collections.sort( list, new Comparator() {

@Override public int compare( JsonElement o1, JsonElement o2 ) { if( Integer.parseInt( o1.getAsJsonObject() .get( "com.tangoe.matrix.catalog.CatalogFeatureDetail" ) .getAsJsonObject() .get( "order" ) .toString() .replace( "\"", "" ) ) > Integer.parseInt( o2.getAsJsonObject() .get( "com.tangoe.matrix.catalog.CatalogFeatureDetail" ) .getAsJsonObject() .get( "order" ) .toString() .replace( "\"", "" ) ) ) { return 1; } else if( Integer.parseInt( o1.getAsJsonObject() .get( "com.tangoe.matrix.catalog.CatalogFeatureDetail" ) .getAsJsonObject() .get( "order" ) .toString() .replace( "\"", "" ) ) < Integer.parseInt( o2.getAsJsonObject() .get( "com.tangoe.matrix.catalog.CatalogFeatureDetail" ) .getAsJsonObject() .get( "order" ) .toString() .replace( "\"", "" ) ) ) { return -1; } else { return 0; } } } ); return list; }

我已发布我的元素只需替换其中的数组元素。