代码之家  ›  专栏  ›  技术社区  ›  Saffik

如何在Java8中创建Json数组,并在为其设置值时仅打印Json?

  •  1
  • Saffik  · 技术社区  · 7 年前

    我正在尝试使用 fasterxml jackson .. 但是我被卡住了。我似乎不知道如何创建数组。

    {
       "setAccId":"12345",
       "groupOf":null,
       "isEnabled":false,
       "list":[
          {
             "student":"jim",
             "type":"S_A",
             "retro":null
          },
          {
             "student":"bob",
             "type":"S_A",
             "retro":null
          }
       ],
       "sort":[]
    }
    

    我有两节课。一个是Json属性,另一个是我打印它的地方。

    下面的类(DynamicJsonHelper)是我拥有所有json属性的地方

    package com.company.jsonfc;
    
    import com.fasterxml.jackson.annotation.JsonProperty;
    import com.fasterxml.jackson.annotation.JsonPropertyOrder;
    
    @JsonPropertyOrder({
    "accId",
    "groupOf",
    "isEnabled"
    })
    
    public class DynamicJsonHelper {
    
        public String accId;
        public String groupOf;
        public List studentList;
    
        @JsonProperty("accId")
        public void setAccId(String accId) {
            this.accId = accId;
        }
    
        @JsonProperty("groupOf")
        public void setGroupOf(String groupOf) {
            this.groupOf = groupOf;
        }
    
        @JsonProperty("isEnabled")
        public boolean isEnabled() {
            return false;
        }
    
        @JsonProperty("studentList")
        public List<StudentList> studentList() {
            return studentList;
        }
    
    }
    

    class StudentList {
        String student;
        String type;
        String retro; 
    }
    

    这里是类(PrintJson),我称之为。

    import com.fasterxml.jackson.annotation.JsonInclude;
    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.databind.node.JsonNodeFactory;
    
    import com.company.jsonfc.DynamicJsonHelper;
    
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public class PrintJson {
    
        @Test
        public void create_json() throws JsonProcessingException {
        final JsonNodeFactory factory = JsonNodeFactory.instance;
    
        DynamicJsonHelper dynamicJsonHelper = new DynamicJsonHelper();
        String jsonString;
        ObjectMapper mapper = new ObjectMapper();
    
        dynamicJsonHelper.setAccId("12345");
    
        jsonString = mapper.writeValueAsString(dynamicJsonHelper);
        System.out.println(jsonString);
        }
    
    }
    

    这将导致打印以下内容:

    {
       "setAccId":"12345",
       "groupOf":null,
       "isEnabled":false
       "studentList":null
    }
    

    1) 如何添加列表:[……]数组&最后的排序:[]也是吗?

    2) 在PrintJson类中,我没有为 groupOf 但它仍然是用Json创建的。如何设置它如果我设置了值,它将被打印。。否则,它不会包含在正在打印的json中。

    如果您能接受我的代码并给出基于它的示例,以便更好地理解,我将不胜感激

    2 回复  |  直到 7 年前
        1
  •  1
  •   YK S    7 年前

    1) 如何添加列表:[……]数组&最后的排序:[]也是吗?

    答复 :您可以为另一个创建两个类 list sort . 现在在课堂上 DynamicJsonHelper 您可以像添加一样添加它们 accId isEnabled 它们将被打印出来。确保在这两个类中都添加所需的字段作为实例变量。例如,对于列表,您可以使用如下类:

    class StudentList{
        String student;
        String type;
        String retro;
    }
    

    动态助手 List<StudentList> . 同样,你也可以为我做些什么 分类 .

    用Json创建。如何设置它如果我设置了值,它将被打印。。 否则,它不会包含在正在打印的json中。

    答复 任何一个 使用对象映射器并将其设置为在序列化期间忽略空字段。例如: mapper.setSerializationInclusion(Include.NON_NULL); 您可以在类级别将其设置为忽略空值(如果有)。例如:

    @JsonInclude(Include.NON_NULL)
    class Test
    {
      String t;
    }
    

    如上所述,如果类型是isEnabled的基本类型,则异常Z的注释不起作用。因此,考虑将其更改为布尔值,并确保其他字段也相同。

    编辑:

    @JsonPropertyOrder({
    "accId",
    "groupOf",
    "isEnabled"
    })
    @JsonInclude(JsonInclude.Include.NON_NULL)
    
    public class DynamicJsonHelper {
    
    public String accId;
    public String groupOf;
    public List<Student> studentList;
    
    @JsonProperty("accId")
    public void setAccId(String accId) {
        this.accId = accId;
    }
    
    @JsonProperty("groupOf")
    public void setGroupOf(String groupOf) {
        this.groupOf = groupOf;
    }
    
    @JsonProperty("isEnabled")
    public boolean isEnabled() {
        return false;
    }
    
    @JsonProperty("studentList")
    public void setStudentList(List<Student> list) {
        this.studentList = list;
    }
    
    }
    
    class Student {
    private String student;
    private String type;
    private String retro; 
    
    public Student(String student, String type, String retro) {
        this.student = student;
        this.type = type;
        this.retro = retro;
    }
    
    public String getStudent() {
        return student;
    }
    
    public void setStudent(String student) {
        this.student = student;
    }
    
    public String getType() {
        return type;
    }
    
    public void setType(String type) {
        this.type = type;
    }
    
    public String getRetro() {
        return retro;
    }
    
    public void setRetro(String retro) {
        this.retro = retro;
    }    
    }
    
    class HelperTest{
    
    public static void main(String[] args) throws JsonProcessingException {
        DynamicJsonHelper dynamicJsonHelper = new DynamicJsonHelper();
        String jsonString;
        ObjectMapper mapper = new ObjectMapper();
    
        dynamicJsonHelper.setAccId("12345");
    
        List<Student> list = Arrays.asList(new Student("s1", "t1", "r1"), new Student("s2", "t2", "r2"));
    
        dynamicJsonHelper.setStudentList(list);
        jsonString = mapper.writeValueAsString(dynamicJsonHelper);
        System.out.println(jsonString);
    
    }
    }
    

    执行程序后 output 如下图所示:

    {
       "accId": "12345",
       "isEnabled": false,
       "studentList": [
                        {
                          "student": "s1",
                          "type": "t1",
                          "retro": "r1"
                        },
                        {
                          "student": "s2",
                          "type": "t2",
                          "retro": "r2"
                        }
                       ]
    }
    
        2
  •  1
  •   Vadim    7 年前

    例如

    public class JsonHolder {
        // appropriate Json/Jackson annotations ommitted
    
         private String  setAccId;
         private String  groupOf;
         private boolean isEnabled;
         private List<DynamicJsonHelper>  list;
         private String[] sort;
    
         // .. getter/setters ...
    

    }

    然后必须创建该对象,并在创建DynamicJsonHelper时将其放入列表或数组中。

    毕竟,您可以序列化JsonHolder对象,您将看到java列表或数组作为JSON数组。

    { ... } 是一个对象,在Java中必须有一个类。

    {
      "setAccId":"12345",
      "groupOf":null,
      "isEnabled":false,
      "list":[
       {
         "student":"jim",
         "type":"S_A",
         "retro":null
      },
      {
         "student":"bob",
         "type":"S_A",
         "retro":null
      }
     ],
     "sort":[]
    }
    

    它是一个对象(让我们命名它) JsonHolder )具有名为 setAcctId, groupOf, isEnabled, list, sort 因此,您必须为它提供一个Java类(与您为您的应用程序所做的类似) DynamicJsonHelper . 您可以以同样的方式使用任何@Json注释(我省略了它们,留给您)。即使您不需要它们,Jackson或任何其他JSON serialiser也会默认使用Java类中的属性名。

    例如,我指的是@JsonProperty(“accId”)

    @JsonProperty("accId")
    public void setAccId(String accId)
    

    顺便说一句,为了代码的可读性,最好像以前那样做。:-)

    根据你的问题: list sort JSON中的属性是数组。Jackson将Java集合类(如List、Set或Array)解析为JSON数组。

    财产就是这样一个集合 动态助手 您创建的对象。在Java类中,列表或数组只是您的选择-使用更适合您的。我建议使用列表而不是数组。在Java中使用数组不是一个好主意。:-)

    到目前为止,您刚刚创建了一个Java类 动态助手 仅适用于必须在中的对象 性质 杰森霍尔德 对象剩下的就是创建“JsonHolder”类,并将该对象提供给Jackson,以便将其序列化为所需的JSON结构。

    null 或空值、更改属性名称、排除要序列化的Java类属性等等。。。一切都取决于你。。。祝你好运