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

如何使用net.sf.JSON在Java中生成JSON字符串?,java,json,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.

我正在努力用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"]}]};
检查一下,它将为您提供大量选项,用于将Java对象序列化到JSON或从JSON反序列化Java对象

来自页面的示例

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);

您的
s
是一个
字符串
,当
放入
JSONObject
时,该字符串不会被取消引用。必须为
数据的值构建另一个
JSONArray

// 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"
            ]
        }
    ]    
}

而不是

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

终于找到了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);

无法在Java中声明JSON字符串是巨大的痛苦。这主要是因为(a)没有多行字符串(b)转义双引号使wrt的可读性变得混乱

我通过使用单引号声明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('\'', '"');
}

有些人可能会觉得这比声明映射更麻烦,但当我必须仅使用字符串语法构建JSON时,这对我来说非常有效。

我发现在不使用Objectmapper或类似工具直接将JSON作为字符串编写时会出现很多问题

我建议您编写Json(按照您的定义):

然后简单地使用这个小小的在线工具:

它可以将简单的Json转换为Java类,也可以使用多个类。您可以在生成过程中选择以后是否要使用Gson或Jackson

格森的重量稍微轻了一点,而梅在开始时更合适。我更喜欢Jackson,因为您可以创建类似于计算属性的东西——但这已经非常详细了

添加Gson后,您只需执行以下操作:

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

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

您得到的输出似乎是正确的,如果我在json中放入字符串,我希望它仍然是字符串,而不是被解析。@denis tulskiy这是一个合理的期望,但json lib不是这样做的。如果字符串值可以解析为JSON,JSON lib将悄悄地解析它,并将JSON值替换为JSON值。例如,
System.out.println(新的JSONObject().element(“outer”,“internal\”:\“value\”)
将打印
{“outer”:{“internal”:“value”}
而不是
{“outer”:“{“internal\”:“value\”}
。有关详细信息,请参见
AbstractJSON
。但是我想导入net.sf.json.JSONArray和net.sf.json.JSONObject,这是否可以使用这些包实现该结构。使用net.sf.json的API应该很容易。我回答的要点是,必须在所有级别上构造所有对象和数组。传递带引号的字符串不起作用。如果我生成这种json结构,只有DHTMLX接受。这就是我问的原因。
{"rows":[{"id":"2","data":["shakil", "29","7676"]}]}
Gson gson = new Gson();
MyGeneratedClass target = new MyGeneratedClass();
String json = gson.toJson(target);