【问题标题】:How to generate JSON string in Java using net.sf.json?如何使用 net.sf.json 在 Java 中生成 JSON 字符串?
【发布时间】:2012-11-12 08:05:16
【问题描述】:

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

【问题讨论】:

  • 你得到的输出似乎是正确的,如果我把一个字符串放在 json 中,我希望它仍然是一个字符串,而不是被解析。
  • @denis-tulskiy 这是一个公平的期望,但这不是 json-lib 所做的。如果一个字符串值可以解析为 JSON,json-lib 会悄悄地解析它并替换为 JSON 值。例如,System.out.println(new JSONObject().element("outer", "{\"inner\":\"value\"}")) 将打印 {"outer":{"inner":"value"}}not {"outer":"{\"inner\":\"value\"}"}。有关详细信息,请参阅 AbstractJSONline 245-271

标签: java json


【解决方案1】:

您的sString,当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"
            ]
        }
    ]    
}

【讨论】:

  • 但我想导入 net.sf.json.JSONArray 和 net.sf.json.JSONObject ,是否可以使用这些包带来该结构。
  • net.sf.json的API应该很好用。我回答的要点是,您必须在 all 级别上构造 all 对象和数组。传递带引号的字符串不起作用。
  • 如果我生成这种只有 DHTMLX 接受的 json 结构。这就是我问的原因。
【解决方案2】:

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

而不是

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        无法在 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 时,这对我有用。

        【讨论】:

          【解决方案6】:

          在不使用 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,而没有考虑以后如何更改它!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-07-17
            • 2018-07-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-06-26
            • 2015-02-22
            • 2014-10-23
            相关资源
            最近更新 更多