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

我正在努力在Java中生成JSON String。

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

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

代替

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

你的s是一个String ,当put JSONObject时它不会被引用。 您必须为data值构建另一个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" ] } ] } 

查看gson ,它将为您提供许多选项,用于将Java对象序列化/反序列化到JSON或从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); 

终于找到了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)转义双引号使得它的可读性变得混乱。

我通过使用单引号来声明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时,这对我有用。

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

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

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

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

哪个可以简单地将Json转换成Java类,也可以转换为多个类。 如果你想在以后使用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而没有考虑如何在以后更改它!