【问题标题】:how to add a List to JSON using Jackson JsonGenerator如何使用 Jackson JsonGenerator 将列表添加到 JSON
【发布时间】:2020-10-01 10:27:36
【问题描述】:

我正在尝试使用 Jackson JsonGenerator 将对象列表写入 JSON。 我想知道这是否可能。

我有一个哈希图,形成为 Key,List

我正在使用 Jackson JsonGenerator 创建一个 JSON。并且希望能够简单地添加一个对象列表,而不是分别处理/循环列表中的每个对象。

这可能吗?

    JsonFactory factory = new JsonFactory();
    StringWriter sw = new StringWriter();
    JsonGenerator generator = factory.createGenerator(sw);
    generator.setPrettyPrinter(new DefaultPrettyPrinter());

        generator.writeStartObject();               // {
        generator.writeFieldName("tags");           // {"tags":
        generator.writeStartArray();                // {"tags": [

    for ( String key : hm.keySet() ) {

        log.info("Record to Convert to JSON: " + key);

        generator.writeStartObject();               // {
        generator.writeStringField("tagId", key);   // { "tagId": "SAGE.esn.tag_name"
        generator.writeFieldName("data");           // { "tagId": "SAGE.esn.tag_name", "data"
        generator.writeStartArray();                // { "tagId": "SAGE.esn.tag_name", "data" : [
//          generator.writeStartObject();               // { "tagId": "SAGE.esn.tag_name", "data" : [{

        generator.write(hm.get(key));  

        generator.writeStringField("ts", data[0].trim()); // { "tagId": "NST_MD1_CRANK_CASE", "data" : [{"ts":"2017-11-15T19:55:00"
        generator.writeEndObject(); // { "tagId": "SAGE.esn.tag_name", "data" : [{"ts":"2017-11-15T19:55:00","v" : "100","q":"3"}
        generator.writeEndArray();  // { "tagId": "SAGE.esn.tag_name", "data" : [{"ts":"2017-11-15T19:55:00","v" : "100","q":"3"}]
        generator.writeEndObject(); // { "tagId": "SAGE.esn.tag_name", "data" : [{"ts":"2017-11-15T19:55:00","v" : "100","q":"3"}]}

    }

        generator.writeEndArray(); // {"tags": [ { "tagId": "SAGE.esn.tag_name", "data" : [{"ts":"2017-11-15T19:55:00","v" : "100","q":"3"}]} ]
        generator.writeEndObject();  // {"tags": [ { "tagId": "SAGE.esn.tag_name", "data" : [{"ts":"2017-11-15T19:55:00","v" : "100","q":"3"}]} ]}
        generator.flush();
        generator.close();

【问题讨论】:

    标签: java json arraylist jackson


    【解决方案1】:

    是的,你几乎做到了。 您应该只遍历您的列表:

    for ( String key : hm.keySet() ) {
    
        log.info("Record to Convert to JSON: " + key);
    
        generator.writeStartObject();               // {
        generator.writeStringField("tagId", key);   // { "tagId": "NST_MD1_CRANK_CASE"
        generator.writeFieldName("data");           // { "tagId": "NST_MD1_CRANK_CASE", "data"
        generator.writeStartArray();                // { "tagId": "NST_MD1_CRANK_CASE", "data" : [
        generator.writeStartObject();               // { "tagId": "NST_MD1_CRANK_CASE", "data" : [{
    
        List<String> data = hm.get(key);
    
        generator.writeStringField("ts", data.get(0).trim()); // { "tagId": "NST_MD1_CRANK_CASE", "data" : [{"ts":"2017-11-15T19:55:00"
        generator.writeStringField("v", data.get(1).trim());  // { "tagId": "NST_MD1_CRANK_CASE", "data" : [{"ts":"2017-11-15T19:55:00", "v":"100"
        generator.writeStringField("q", data.get(2).trim());  // { "tagId": "NST_MD1_CRANK_CASE", "data" : [{"ts":"2017-11-15T19:55:00", "v":"100", "q":"3"
        generator.writeEndObject(); // { "tagId": "NST_MD1_CRANK_CASE", "data" : [{"ts":"2017-11-15T19:55:00", "v":"100", "q":"3"}
        generator.writeEndArray();  // { "tagId": "NST_MD1_CRANK_CASE", "data" : [{"ts":"2017-11-15T19:55:00", "v":"100", "q":"3"}]
        generator.writeEndObject(); // { "tagId": "NST_MD1_CRANK_CASE", "data" : [{"ts":"2017-11-15T19:55:00", "v":"100", "q":"3"}]}
    }
    

    那么,如果你准备一些数据:

    Map<String, List<String>> hm = new HashMap<>();
    hm.put("NST_MD1_CRANK_CASE", Arrays.asList("2017-11-15T19:55:00", "100","3"));
    hm.put("SAGE.esn.tag_name", Arrays.asList("2017-11-15T19:55:00", "100","3"));
    

    并将您选择作为输出的StringWriter 的内容打印到控制台,您会得到以下结果:

    {
      "tags" : [ {
        "tagId" : "NST_MD1_CRANK_CASE",
        "data" : [ {
          "ts" : "2017-11-15T19:55:00",
          "v" : "100",
          "q" : "3"
        } ]
      }, {
        "tagId" : "SAGE.esn.tag_name",
        "data" : [ {
          "ts" : "2017-11-15T19:55:00",
          "v" : "100",
          "q" : "3"
        } ]
      } ]
    }
    

    如果需要将数据写成数组,可以这样:

    for ( String key : hm.keySet() ) {
    
        log.info("Record to Convert to JSON: " + key);
    
        generator.writeStartObject();               // {
        generator.writeStringField("tagId", key);   // { "tagId": "NST_MD1_CRANK_CASE"
        generator.writeFieldName("data");           // { "tagId": "NST_MD1_CRANK_CASE", "data"
        generator.writeStartArray();                // { "tagId": "NST_MD1_CRANK_CASE", "data" : [
    
        List<String> data = hm.get(key);
        for (String s : data) {
            generator.writeString(s);
        }
    
        generator.writeEndArray();  // { "tagId": "NST_MD1_CRANK_CASE", "data" : ["2017-11-15T19:55:00", "100", "3"]
        generator.writeEndObject(); // { "tagId": "NST_MD1_CRANK_CASE", "data" : ["2017-11-15T19:55:00", "100", "3"]}
    }
    

    那么相同输入数据的输出为:

    {
      "tags" : [ {
        "tagId" : "NST_MD1_CRANK_CASE",
        "data" : [ "2017-11-15T19:55:00", "100", "3" ]
      }, {
        "tagId" : "SAGE.esn.tag_name",
        "data" : [ "2017-11-15T19:55:00", "100", "3" ]
      } ]
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多