【问题标题】:How do I provide the following json output using java如何使用 java 提供以下 json 输出
【发布时间】:2010-10-27 16:04:21
【问题描述】:

我正在尝试使用 java net.sf.json 库生成以下 json 输出,但没有成功。

[ { “数据”: [ [ 1、 1、 “文本” ], [ 2、 2、 “文本” ], [ 3、 0, “文本” ], [ 5、 2、 “文本” ] ], “标签”:“第一系列” } ]

我在这些论坛上阅读过 Gson 是我未来的最佳选择。谁能提供一个如何使用 Gson 或其他合适的基于 java 的库生成此 json 的示例。

提前致谢

【问题讨论】:

    标签: java json gson


    【解决方案1】:

    我喜欢这个 http://www.json.org/javadoc/org/json/JSONObject.html 来自 http://json.org/java/

    和 JSONArray。

    这两个对象:

    JSONArray inner = new JSONArray()
    inner.add(1);inner.add("text");
    JSONObject outer = new JSONObject();
    outer.put("data",inner);
    outer.put("label", "stuff");
    
    String out = outer.toString()
    

    【讨论】:

    • 我试过了,它成功了。我添加了几个内部来完全匹配我所追求的 json。非常感谢。
    【解决方案2】:

    Gson

    Gson 是一个 Java 库,可用于将 Java 对象转换为其 JSON 表示形式。它还可用于将 JSON 字符串转换为等效的 Java 对象。 Gson 可以处理任意 Java 对象,包括您没有源代码的预先存在的对象。

    有一些开源项目可以将 Java 对象转换为 JSON。但是,它们中的大多数要求您在类中放置 Java 注释,如果您无权访问源代码,则无法做到这一点。大多数也不完全支持使用 Java 泛型。 Gson 认为这两个都是非常重要的设计目标。

    import com.google.gson.Gson;
     
    class Person {
      private int age = 10;
      private String name = "jigar";
    }
     
    Person obj = new Person();
    Gson gson = new Gson();
    String json = gson.toJson(obj);
    

    http://json.org/java/

    import org.json.JSONObject;
    
    ...
    ...
    
    JSONObject json = new JSONObject();
    json.put("city", "Mumbai");
    json.put("country", "India");
    
    ...
    
    String output = json.toString();  
    

    【讨论】:

      【解决方案3】:

      使用这样的 Java 对象很容易:

      public class GsonTest {
        private List<DataItem> data;
        private String label;
      
        public GsonTest() {} // for Gson
      
        public GsonTest(List<DataItem> data, String label) {
          this.data = data;
          this.label = label;
        }
        // ...
      }
      
      public class DataItem {
        private int val1;
        private int val2;
        private String text;
      
        public DataItem() {} // for Gson
      
        public DataItem(int val1, int val2, String text) {
          this.val1 = val1;
          this.val2 = val2;
          this.text = text;
        }
        // ...
      }
      

      由于您的 JSON 格式对每个数据项使用数组而不是对象(根据您的示例,对象会更有意义),您需要添加一个自定义处理程序来序列化和反序列化 DataItems 与 JSON 数组.

      public class DataItemConverter implements JsonDeserializer<DataItem>,
          JsonSerializer<DataItem> {
      
        public DataItem deserialize(JsonElement json, Type typeOfT, 
            JsonDeserializationContext context) throws JsonParseException {
          JsonArray array = json.getAsJsonArray();
          int val1 = array.get(0).getAsInt();
          int val2 = array.get(1).getAsInt();
          String text = array.get(2).getAsString();
          return new DataItem(val1, val2, text);
        }
      
        public JsonElement serialize(DataItem src, Type typeOfSrc, 
            JsonSerializationContext context) {
          JsonArray array = new JsonArray();
          array.add(new JsonPrimitive(src.val1));
          array.add(new JsonPrimitive(src.val2));
          array.add(new JsonPrimitive(src.text));
          return array;
        }
      }
      

      然后,您只需在创建 Gson 实例时注册此转换器即可!由于我们的 DataItem 转换器也处理反序列化,因此您也可以将生成的 JSON 反序列化为 List&lt;GsonTest&gt;

      public static void testSerialization() {
        List<DataItem> data = new ArrayList<DataItem>();
        data.add(new DataItem(1, 1, "Text"));
        data.add(new DataItem(2, 2, "Text"));
        data.add(new DataItem(3, 0, "Text"));
        data.add(new DataItem(5, 2, "Text"));
      
        GsonTest test = new GsonTest(data, "First Series");
        List<GsonTest> list = new ArrayList<GsonTest>();
        list.add(test);
        Gson gson = new GsonBuilder()
            .registerTypeAdapter(DataItem.class, new DataItemConverter())
            .create();
        System.out.println(gson.toJson(list));
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-15
        相关资源
        最近更新 更多