10

我正在努力在 Java 中生成 JSON 字符串。

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

JSONArray ja = new JSONArray();
JSONObject js = new JSONObject();
JSONObject j = new JSONObject();

String s = "[{\"shakil\",\"29\",\"7676\"}]";

js.put("id", "1");
js.put("data", s);
ja.add(js);

j.put("rows", ja);

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

实际输出:

{"rows":[{"id":"2","data":"[{\"shakil\",\"29\",\"7676\"}]"}]}

预期输出:

{"rows":[{"id":"2","data":["shakil", "29","7676"]}]};
4

6 回答 6

22

s是 a在进入 aString没有被引用。您必须为以下值构建另一个:putJSONObjectJSONArraydata

// using http://jettison.codehaus.org/
JSONObject outerObject = new JSONObject();
JSONArray outerArray = new JSONArray();
JSONObject innerObject = new JSONObject();
JSONArray innerArray = new JSONArray();

innerArray.put("shakil");
innerArray.put("29");
innerArray.put("7676");

innerObject.put("id", "2");
innerObject.put("data", innerArray);

outerArray.put(innerObject);

outerObject.put("rows", outerArray);

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

结果:

{
    "rows": [
        {
            "id": "2",
            "data": [
                "shakil",
                "29",
                "7676"
            ]
        }
    ]    
}
于 2012-11-12T08:20:23.627 回答
10

String[] s = new String[] {"shakil", "29" , "7676"};

代替

String s = "[{\"shakil\",\"29\",\"7676\"}]";
于 2012-11-12T09:16:21.050 回答
1

查看gson,它将为您提供大量用于将 Java 对象序列化/反序列化到 JSON 的选项。

取自页面的示例

Gson gson = new Gson();
int[] ints = {1, 2, 3, 4, 5};
String[] strings = {"abc", "def", "ghi"};

//(Serialization)
gson.toJson(ints);     ==> prints [1,2,3,4,5]
gson.toJson(strings);  ==> prints ["abc", "def", "ghi"]

//(Deserialization)
int[] ints2 = gson.fromJson("[1,2,3,4,5]", int[].class);
于 2012-11-12T08:09:12.810 回答
1

终于找到了 net.sf.json 的答案

JSONArray data1 = new JSONArray();
data1.add("shakil");
data1.add("29");
data1.add("100");

JSONObject inner1 = new JSONObject();
inner1.put("id", "1");
inner1.put("data", data1);

JSONArray list2 = new JSONArray();
list2.add(inner1);

JSONObject finalObj = new JSONObject();
finalObj.put("rows", list2);

System.out.println(finalObj);
于 2012-11-12T10:03:33.757 回答
1

无法在 Java 中声明 JSON 字符串是一件非常痛苦的事情。主要是由于(a)没有多行字符串(b)转义双引号使其可读性一团糟。

我通过使用单引号来声明 JSON 字符串(使用标准的多行连接)来解决这个问题。没有什么花哨:

String jsonStr = 
    "{" +
        "'address': " + 
        "{" +
            "'name': '" + name + "'," +
            "'city': '" + city + "'," +
            "'street1': '"+ street1 +"'," +
            "'street2': '"+ street2 +"'," +
            "'zip': '" + zip + "', " +
            "'state':'" + state + "'," +
            "'country': '" + country + "'," +
            "'phone': '" + phone + "'" +
        "}" +
    "}";
jsonStr = MyUtil.requote(jsonStr);
System.out.println(jsonStr);

我的实用程序

public static String requote(String jsonString) {
    return jsonString.replace('\'', '"');
}

有些人可能会觉得这比声明 Map 更麻烦,但是当我必须使用字符串语法构建 JSON 时,这对我有用。

于 2015-04-05T22:21:23.177 回答
1

在不使用 Objectmapper 或类似工具的情况下直接将 json 编写为 String 时,我看到了很多问题。

我建议你写你的 Json (正如你定义的那样):

{"rows":[{"id":"2","data":["shakil", "29","7676"]}]}

然后只需使用这个小在线工具: http: //www.jsonschema2pojo.org/

它可以将简单的 Json 转换为具有多个类的 Java-Class。如果您想稍后使用 Gson 或 Jackson,您可以在生成期间进行选择。

Gson 稍微轻一些,可能更适合开始使用。我更喜欢 Jackson,因为你可以创建类似计算属性的东西——但这已经很详细了。

https://code.google.com/p/google-gson/

添加 Gson 后,您需要做的就是:

Gson gson = new Gson();
MyGeneratedClass target = new MyGeneratedClass();
String json = gson.toJson(target);

瞧:您已经生成了一个简单的 json,而没有考虑以后如何更改它!

于 2015-04-05T23:48:03.157 回答