如何使用net.sf.json在Java中生成JSON字符串?

时间:2012-11-12 08:05:17

标签: java json

我正在努力用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"]}]};

6 个答案:

答案 0 :(得分:22)

s String put JSONObject JSONArray data // 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" ] } ] } {{1}}。您必须为{{1}}:

的值构建另一个{{1}}
{{1}}

结果:

{{1}}

答案 1 :(得分:10)

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

而不是

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

答案 2 :(得分: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);

答案 3 :(得分: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);

答案 4 :(得分: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);

MyUtil

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

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

答案 5 :(得分:1)

在没有使用Objectmapper或类似的情况下直接将json写为String时,我发现了很多问题。

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

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

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

这可以简单地将Json转换成Java类,也可以使用多个类。如果你想在以后使用Gson或Jackson,那么你可以在那一代选择。

Gson有点轻量级,可能更适合开始。我更喜欢杰克逊,因为你可以创造类似计算属性的东西 - 但这已经非常详细了。

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

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

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

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