【问题标题】:How do I create Json Array in Java8 and only print json if I set value for it?如何在 Java8 中创建 Json 数组,如果我为它设置值,则只打印 json?
【发布时间】:2018-12-19 16:47:02
【问题描述】:

我正在尝试使用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 中。

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

【问题讨论】:

    标签: java arrays json jackson


    【解决方案1】:

    1) 如何在最后添加列表:[ ... ] 数组和排序:[ ]?

    答案:您可以再创建两个类,一个用于list,一个用于sort。现在在 DynamicJsonHelper 类中,您可以像添加 accIdisEnabled 一样添加它们 它们将被打印出来。确保将您想要的字段添加为两个类中的实例变量。例如,对于列表,您可以有一个类:

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

    现在在你的类中添加一个字段DynamicJsonHelperList&lt;StudentList&gt;。同样,您可以为sort 做。

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

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

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

    正如上面 aBnormaLz 在 cmets 中提到的,如果类型是原始类型,就像您为 isEnabled 设置的那样,则该类型不起作用。因此,请考虑将其更改为布尔值并确保其他字段也相同。

    编辑:

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

    【讨论】:

    • Include.NON_NULL 仍将打印"isEnabled" :false,因为它是一个原始布尔值。您还应该将其更改为 Boolean
    • @aBnormaLz 感谢您指出这一点。我将编辑答案。
    • @aBnormaLz I will edit the answer 让我错过了投票。再次感谢:)
    • Weeeheeee =) =) 欢迎您 :) (另外我不知道您没有获得评论赞誉 :( )
    • @Saffik 我在 Edit 部分下添加了一段工作代码。看看并尝试找出我对您的代码所做的更改。如果您有任何疑问,请发布问题。别担心,除了你的问题,你不需要说任何话。这就是为什么存在stackoverflow,人们在这里回答有意义的问题:)
    【解决方案2】:

    您错过了必须拥有第三类的一点,并且它必须具有 java.util.List 类型的属性或您的示例的数组和名称列表。

    例如

    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 List 或 Array 作为 JSON 数组。

    UPD:请注意,在像 { ... } 这样的 JSON 结构中,它是一个对象,而在 Java 中,它必须有一个类。

    所以,从您发布的 JSON 结构开始

    {
      "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 序列化程序将默认使用 Java 类中的属性名称。

    我的意思是你的 @JsonProperty("accId")

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

    只要 getter/setter/property 也命名为 getAcctId、setAcctId、acctId,则不需要。如果没有 @JsonProperty 注释,Jackson 将使用它。

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

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

    然后根据所需的 JSON 结构 list 属性是您创建的 DynamicJsonHelper 对象的此类集合。在 Java 类中,List 或 Array 只是您的选择 - 使用更适合您的。我建议使用列表而不是数组。在 Java 中使用数组不是一个好主意。 :-)

    到目前为止,您刚刚为必须在JsonHolder 对象的list 属性中的对象创建了一个Java 类DynamicJsonHelper。剩下的就是创建“JsonHolder”类并将该对象提供给 Jackson 以将其序列化为所需的 JSON 结构。

    您可以使用一堆@Json 注释来允许或不允许null 或空值、更改属性名称、排除要序列化的Java 类属性等等......一切都取决于你...... . 祝你好运!

    【讨论】:

      猜你喜欢
      • 2021-08-20
      • 2013-03-05
      • 2016-10-26
      • 2021-12-26
      • 1970-01-01
      • 2015-06-07
      • 1970-01-01
      • 2011-10-30
      • 1970-01-01
      相关资源
      最近更新 更多