我正在用java中的jackson构建一个json体。它会像下面这样
{
"subject": "math",
"marks": "100",
"student":{
"name": "x",
"class": "8"
}
}
基于不同的 REST URI,json 主体必须忽略某些字段或元素。如何使用杰克逊忽略上述 json 正文中的“学生”部分?当我忽略它时,我应该只能得到
{ "subject": "math", "marks": "100"}
但我得到它如下,这是不正确的-
{ "subject": "math", "marks": "100","student":{}}
我有两个带有getters和setters的类,一个作为主语,另一个作为学生。我尝试使用@JsonIgnore,但是它忽略了所有的URI,这是我不想要的。我也试过@JsonInclude(包含。非空)。我如何实现这一点?
我在这里添加我的代码。基于不同的REST URI,json主体必须忽略一些字段或元素。例如,对于一个URI,它应该包括所有字段,对于另一个URI,它应该忽略学生。分数=新分数();
score.setSubject("math");
score.setMarks("100");
Score.Student student =score.new Student();
score.setStudent(student);
switch (type) {
case StudentAdd:
score.setSubject("math");
score.setMarks("100");
break;
case StudentDelete:
score.setSubject("math");
score.setMarks("100");
break;
case StudentComplete:
score.setChangeReason("C");
default:
break;
score.setSubject("math");
score.setMarks("100");
score.setStudent(student);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(SerializationFeature.INDENT_OUTPUT, true);
//objectMapper.setSerializationInclusion(Include.NON_NULL);
objectMapper.setSerializationInclusion(Include.NON_EMPTY);
StringWriter jsonBody = new StringWriter();
objectMapper.writeValue(jsonBody, score);
return jsonBody.toString();
}
//@JsonInclude(Include.NON_EMPTY)
class Score {
private String subject;
private String marks;
private Student student;
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getMarks() {
return marks;
}
public void setMarks(String marks) {
this.marks = marks;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
//@JsonInclude(Include.NON_NULL)
class Student {
private String name;
@JsonProperty("class")
private String clazz;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getClazz() {
return clazz;
}
public void setClazz(String clazz) {
this.clazz = clazz;
}
}
}
}
}
在ObjectMapper中将WRITE_NULL_MAP_VALUES
设置为false。
代码:
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationConfig.Feature.WRITE_NULL_MAP_VALUES, false);
编辑
这些帖子似乎是重复的。
编辑2
使用@JsonView而不是@JsonFilter
下面是使用 @JsonView 打印同一 JSON 对象的不同视图的示例代码:
{ "科目":"数学","分数":" 100"}
和
{“主题”:“数学”,“标记”:“100”,“学生”:{“名称”:“x”,“类”:“8”}}
public class Views {
public static class Filtered {}
public static class All extends Filtered {}
}
public class Student {
private String name;
@JsonProperty("class")
private String clazz;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getClazz() {
return clazz;
}
public void setClazz(String clazz) {
this.clazz = clazz;
}
}
public class Score {
@JsonView(Views.Filtered.class)
private String subject;
@JsonView(Views.Filtered.class)
private String marks;
@JsonView(Views.All.class)
private Student student;
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getMarks() {
return marks;
}
public void setMarks(String marks) {
this.marks = marks;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
}
public class JsonTest {
public static void main(String[] args) throws JsonProcessingException {
Student student = new Student();
student.setName("x");
student.setClazz("8");
Score score = new Score();
score.setSubject("math");
score.setMarks("100");
score.setStudent(student);
ObjectMapper mapper = new ObjectMapper();
//do not serialize student property
System.out.println(mapper.writerWithView(Views.Filtered.class).writeValueAsString(score));
//also serialize student property
System.out.println(mapper.writeValueAsString(score));
}
}
这可以在注释上使用< code>JsonInclude进行配置,其值为< code>NON_NULL而不是< code>NON_EMPTY。
对于NON_EMPTY和NON_NULL的Javadoc还不太清楚,但是我的实验表明,使用NON_NULL可以像您期望的那样使用Jackson 2.6.2。
@JsonProperty
@JsonInclude(Include.NON_NULL)
private Student student;
示例
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writeValueAsString(new Foo(100, new Student("bob"), "math")));
System.out.println(mapper.writeValueAsString(new Foo(100, null, "math")));
输出
{"marks":100,"subject":"math","student":{"name":"bob"}}
{"marks":100,"subject":"math"}
注意这也可以使用全局设置
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
这是我的东西 当我得到响应时,我看到 我的看起来像 问题 如何消除中的值?
我使用Spring框架从GET请求接收JSON。所有的工作都很好,直到在DB中输入了一个错误的值,发生了以下情况: 02-25 14:46:04.035:E/AndroidRuntime(12271):org.springframework.http.converter.httpmessagenotreadableException:无法读取JSON:无法从字符串值“-3600”构造java.ut
读取文件已支持 windows 系统,版本号大于等于 1.3.4.1; 扩展版本大于等于 1.2.7; PECL 安装时将会提示是否开启读取功能,请键入 yes; 测试数据准备 $config = ['path' => './tests']; $excel = new \Vtiful\Kernel\Excel($config); // 写入测试数据 $filePath = $excel->f
问题内容: 我目前正在使用杰克逊2.1.4,并且在将对象转换为JSON字符串时忽略字段时遇到了一些麻烦。 这是我的类,它充当要转换的对象: 这是我如何转换它: 这是输出: 如何避免这些空值?我只想获取“订阅”目的所需的信息! 这正是我要查找的输出: 我还尝试了@JsonInclude(Include.NON_NULL)并将所有变量都设置为null,但是它也不起作用!感谢您的帮助! 问题答案: 您将
知道我做错了什么吗?如果重要的话,我将使用Jackson-core 2.1.1。
下面是我的类,它充当要转换的对象: 下面是我的转换方法: 输出如下: 下面正是我要查找的输出: 我还尝试了@jsonInclude(include.non_null),并将我的所有变量置为null,但也没有起作用!谢谢你们的帮助!