如何使用net.sf.JSON在Java中生成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.
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);