向JSONObject添加数据

25

我正试图弄清楚如何将以下数据添加到我的JSON对象中。是否有人可以向我展示如何做到这一点。

网站示例

$(document).ready(function() {
  $('#example').dataTable( {
    "aoColumnDefs": [
     { "aDataSort": [ 0, 1 ], "aTargets": [ 0 ] },
     { "aDataSort": [ 1, 0 ], "aTargets": [ 1 ] },
     { "aDataSort": [ 2, 3, 4 ], "aTargets": [ 2 ] }
   ]
  } );
} );

我需要将上述示例合并到我的JSONObject中。

    JSONObject json = new JSONObject();
    json.put("aoColumnDefs", );
3个回答

35

为了得到这个结果:

{"aoColumnDefs":[{"aTargets":[0],"aDataSort":[0,1]},{"aTargets":[1],"aDataSort":[1,0]},{"aTargets":[2],"aDataSort":[2,3,4]}]}

它保存与以下数据相同的数据:

  {
    "aoColumnDefs": [
     { "aDataSort": [ 0, 1 ], "aTargets": [ 0 ] },
     { "aDataSort": [ 1, 0 ], "aTargets": [ 1 ] },
     { "aDataSort": [ 2, 3, 4 ], "aTargets": [ 2 ] }
   ]
  }

你可以使用以下代码:

    JSONObject jo = new JSONObject();
    Collection<JSONObject> items = new ArrayList<JSONObject>();

    JSONObject item1 = new JSONObject();
    item1.put("aDataSort", new JSONArray(0, 1));
    item1.put("aTargets", new JSONArray(0));
    items.add(item1);
    JSONObject item2 = new JSONObject();
    item2.put("aDataSort", new JSONArray(1, 0));
    item2.put("aTargets", new JSONArray(1));
    items.add(item2);
    JSONObject item3 = new JSONObject();
    item3.put("aDataSort", new JSONArray(2, 3, 4));
    item3.put("aTargets", new JSONArray(2));
    items.add(item3);

    jo.put("aoColumnDefs", new JSONArray(items));

    System.out.println(jo.toString());

谢谢您的帮助,但是我在将Arrays.asList添加到JSONObject java.lang.RuntimeException时遇到了异常。JSONObject属性可能是Boolean、Number、String之一,有什么建议吗? - Code Junkie
你想在这个集合中添加什么? - Francisco Spaeth
你使用的JSON库是哪个版本?我正在使用这个:http://mvnrepository.com/artifact/org.json/json/20090211 (<dependency><groupId>org.json</groupId><artifactId>json</artifactId> <version>20090211</version></dependency>) - Francisco Spaeth
好问题,我正在使用捆绑了Tapestry JSON的Tapestry5框架。我需要研究一下那个版本,但是让这个工作起来的解决方案似乎只是使用一个新的JSONArray(0, 1)代替Arrays.asList。 - Code Junkie

18

答案是使用JSONArray,并且“深入”树形结构:

JSONArray arr = new JSONArray();
arr.put (...); // a new JSONObject()
arr.put (...); // a new JSONObject()

JSONObject json = new JSONObject();
json.put ("aoColumnDefs",arr);

3
Francisco Spaeth的回答可行且易于理解。然而,我认为构建JSON的方法不好!当我将一些Python代码转换成Java时,我意识到可以使用字典和嵌套列表等方式以极大的轻松程度构建JSON。

我真正不喜欢的是必须实例化单独的对象(通常还要给它们命名)来构建这些嵌套结构。如果你有很多对象或数据要处理,或者你的用途更为抽象,那真的很麻烦!

我试图通过尝试清除并重复使用临时JSON对象和列表来解决这个问题,但对我来说这并没有起作用,因为这些Java对象中的所有puts和gets等操作都是按引用而非按值进行的。所以,即使我的代码看起来不太丑陋(尽管风格有所不同),我最终仍会得到包含一堆混乱数据的JSON对象。

因此,我想到了一种方法来优化这个问题。它可能需要进一步开发,但这应该有助于为那些寻找更合理JSON构建代码的人提供一个基础:

import java.util.AbstractMap.SimpleEntry;
import java.util.ArrayList;
import java.util.List;
import org.json.simple.JSONObject;

//  create and initialize an object 
public static JSONObject buildObject( final SimpleEntry... entries ) { 
    JSONObject object = new JSONObject();
    for( SimpleEntry e : entries ) object.put( e.getKey(), e.getValue() );
    return object;
}

//  nest a list of objects inside another                          
public static void putObjects( final JSONObject parentObject, final String key,
                               final JSONObject... objects ) { 
    List objectList = new ArrayList<JSONObject>();
    for( JSONObject o : objects ) objectList.add( o );
    parentObject.put( key, objectList );
}   

实现示例:

JSONObject jsonRequest = new JSONObject();
putObjects( jsonRequest, "parent1Key",
    buildObject( 
        new SimpleEntry( "child1Key1", "someValue" )
      , new SimpleEntry( "child1Key2", "someValue" ) 
    )
  , buildObject( 
        new SimpleEntry( "child2Key1", "someValue" )
      , new SimpleEntry( "child2Key2", "someValue" ) 
    )
);      

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接