[英]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中的list
和sort
属性是数组。 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
您可以像添加accId
或isEnabled
一样添加它们两者,然后将它们打印出来。 确保在两个类中都将您想要的字段添加为实例变量。 例如,您可以使用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.