使用 JSONObject 和 JSONArray 创建 json 字符串

Posted

技术标签:

【中文标题】使用 JSONObject 和 JSONArray 创建 json 字符串【英文标题】:creating json string using JSONObject and JSONArray 【发布时间】:2012-07-20 04:21:53 【问题描述】:

我有这样的数据:

新闻项目:

身份证 标题 日期 txt

可能有很多 NewsItems 说 10。我必须将它们发送到 jquery。

我正在这样做:

JSONObject obj = new JSONObject();
JSONArray arr = new JSONArray();

for(int i = 0 ; i< list.size() ; i++)
    p = list.get(i);
    arr.put(p.getId());
    arr.put(p.getTitle());
    arr.put(new MyDateFormatter().getStringFromDateDifference(p.getCreationDate()));
    arr.put(getTrimmedText(p.getText()));
    obj.put(""+i,arr);
    arr = new JSONArray();

这将创建一个像这样的 JSON 字符串:"1":["id","title","date","txt"],"2":[......and so on...

这是正确的做法吗?

如何解析这个字符串,以便在 jQuery 中获取每个新闻项目对象,以便访问 attr。

像这样:

obj.id,
obj.title

或者如果这是创建 JSON 字符串的错误方式,请通过 jQuery 解析示例提出一些更好的方法。

【问题讨论】:

downvoter : 这是一个给你的评论区.... 【参考方案1】:

我相信您是在向后组织数据。看来您想使用NewsItems 的数组,如果是这样,那么您的 java JSON 生成代码应该如下所示:

JSONObject obj = new JSONObject();
JSONArray arr = new JSONArray();

for(int i = 0 ; i< list.size() ; i++)

    p = list.get(i);

    obj.put("id", p.getId());
    obj.put("title", p.getTitle());
    obj.put("date". new MyDateFormatter().getStringFromDateDifference(p.getCreationDate()));
    obj.put("txt", getTrimmedText(p.getText()));

    arr.put(obj);

    obj = new JSONObject();

现在您的 JSON 字符串将如下所示:

["id": "someId", "title": "someTitle", "date": "dateString", "txt": "someTxt",
 "id": "someOtherId", "title": "someOtherTitle", "date": "anotherDateString", "txt": "someOtherTxt",
 ...]

假设您的 NewsItem 获取器返回 Strings。 JSONObject 方法put 也被重载以采用原始类型,所以如果,例如你的getId 返回一个int,然后它将被添加为一个裸JSON int。我假设 JSONObject.put(String, Object) 调用 toString 的值,但我无法验证这一点。

现在在javascript中,你可以直接使用这样的字符串:

var arr =
    ["id": "someId", "title": "someTitle", "date": "dateString", "txt": "someTxt",
     "id": "someOtherId", "title": "someOtherTitle", "date": "anotherDateString", "txt": "someOtherTxt"];

for (i = 0; i < arr.length; i++)
    alert(arr[i].title); // should show you an alert box with each first title

【讨论】:

如何在循环中遍历每个对象.... arr[0] .. arr[1] 可以,但如果我不知道项目的数量,那么我该如何访问它们??? @JAVAGeek:javascript 数组有一个 length 属性,请参阅编辑 使用什么库? javax.json? @pb2q 您可能希望将arr.put(obj); 更改为arr.add(obj); 以避免The method put(JSONObject) is undefined for the type JSONArray 错误。【参考方案2】:

json 对象的概念与字典/映射相同,您可以在其中为这些键分配键和值,因此您要构造的内容如下所示:

"1": "title": "my title", "date": "17-12-2011", "text": "HELLO!", "2": ....

其中“1”是 id,内容是另一个带有信息的字典/地图。

假设您将对象分配给名为 my_map 的变量,现在您可以将其处理为:

 my_map.1.title
 my_map.3.text
 ...

要遍历它,只需使用:

for (info in my_map)
    data = my_map[info];
    //do what you need

【讨论】:

【参考方案3】:

这是正确的方法-

final JSONArray arr = new JSONArray();

for(int i = 0 ; i< list.size() ; i++) 
    final JSONObject obj = new JSONObject();
    p = list.get(i);
    obj.add("id", p.getId());
    obj.add("title", p.getTitle());
    obj.add("date", new MyDateFormatter().getStringFromDateDifference(p.getCreationDate()));
    obj.add("txt", getTrimmedText(p.getText()));
    arr.add(obj);

这会生成

["id": 1, "date": 222, "title": "abc", "txt": "some text", ...]

现在,当您在客户端解析 json 时,您可以遍历数组,并且对于每个 json 对象,您可以访问为 -

obj.idobj["id"]

【讨论】:

不是obj.add("","");,是obj.put("",""); 列表?我有 2 个字符串。 'obj' 在 for 循环结束时没有被清除。它需要类似 obj = new JSONObject();在 for 循环中的每次迭代结束时【参考方案4】:

用于将 JSON 对象转换为 JSON 字符串使用

JSON.stringify(json_object)

反向使用:

JSON.parse(json_string)

【讨论】:

如果你使用 json-simple 你可以使用 toJSONString() 方法 这是来自哪个库? @Vic 可用于 javascript:w3schools.com/js/js_json_intro.asp

以上是关于使用 JSONObject 和 JSONArray 创建 json 字符串的主要内容,如果未能解决你的问题,请参考以下文章

JSONArray和JSONObject的简单使用

使用 JSONObject 和 JSONArray 构建 JSON Web Token

JSONObject与JSONArray的使用

Android中的JSONObject和JSONArray的使用

JSONObject 和 JSONArray 的区别

使用 JSONObject 和 JSONArray 创建 json 字符串