繁体   English   中英

如何在Java8中创建Json数组,并且仅在设置值的情况下才打印json?

[英]How do I create Json Array in Java8 and only print json if I set value for it?

我正在尝试使用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.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批注d也是如此(我省略了它们,留给了你)即使你没有它们,杰克逊或任何其他JSON序列化程序也将默认使用Java类中的属性名称。

我的意思是例如您的@JsonProperty(“ accId”)

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

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

顺便说一句,最好这样做,就像您为代码可读性所做的那样。 :-)

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

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

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

有很多@Json批注可用于允许或不允许为null或空值,更改属性名称,排除要序列化的Java类属性,依此类推,等等...一切取决于您...祝您好运!

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

:您可以再创建两个类,一个用于list ,另一个用于sort 现在,在类DynamicJsonHelper您可以像添加accIdisEnabled一样添加它们两者,然后将它们打印出来。 确保在两个类中都将您想要的字段添加为实例变量。 例如,您可以使用list这样的类:

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

现在,在类DynamicJsonHelper中将一个字段添加为List<StudentList> 同样,您可以进行sort

2)在PrintJson类中,我没有为groupOf设置值,但仍在Json中创建。 我如何设置它,以便在设置值时将其打印..否则它不包含在正在打印的json中。

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

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

如aBnormaLz的注释中所述,如果类型像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"
                    }
                   ]
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM