我目前正在使用jackson 2.1.4,当我将对象转换为JSON字符串时,我在忽略字段时遇到了一些麻烦.
这是我的类,它充当要转换的对象:
public class JsonOperation {
public static class Request {
@JsonInclude(Include.NON_EMPTY)
String requestType;
Data data = new Data();
public static class Data {
@JsonInclude(Include.NON_EMPTY)
String username;
String email;
String password;
String birthday;
String coinsPackage;
String coins;
String transactionId;
boolean isLoggedIn;
}
}
public static class Response {
@JsonInclude(Include.NON_EMPTY)
String requestType = null;
Data data = new Data();
public static class Data {
@JsonInclude(Include.NON_EMPTY)
enum ErrorCode { ERROR_INVALID_LOGIN, ERROR_USERNAME_ALREADY_TAKEN, ERROR_EMAIL_ALREADY_TAKEN };
enum Status { ok, error };
Status status; …Run Code Online (Sandbox Code Playgroud) 我试图用Jackson将一些JSON对象映射到Java对象.JSON对象中的某些字段是必需的(我可以标记@NotNull),有些是可选的.
与Jackson映射后,未在JSON对象中设置的所有字段在Java中都将具有空值.是否有类似的注释@NotNull可以告诉Jackson为Java类成员设置默认值,以防它为null?
编辑:为了使问题更清楚,这里是一些代码示例.
Java对象:
class JavaObject {
@NotNull
public String notNullMember;
@DefaultValue("Value")
public String optionalMember;
}
Run Code Online (Sandbox Code Playgroud)
JSON对象可以是:
{
"notNullMember" : "notNull"
}
Run Code Online (Sandbox Code Playgroud)
要么:
{
"notNullMember" : "notNull",
"optionalMember" : "optional"
}
Run Code Online (Sandbox Code Playgroud)
该@DefaultValue注释只是为了展示一下我问.这不是一个真正的注释.如果JSON对象与第一个示例中的相似,我想要的值optionalMember是"Value"和不是null.是否有注释可以做这样的事情?
如果我使用注释构造函数参数@JsonProperty但Json没有指定该属性会发生什么.构造函数得到什么价值?
如何区分具有空值的属性与JSON中不存在的属性?
我Map<String,Foo> foosMap想要通过杰克逊序列化.现在我想在序列化过程中遵循两个设置:
实现这一目标的最佳方法是什么?我在我的项目中使用jackson-core1.9和jackson-mapper1.9罐子.
我有一个JSON对象,可能包含一些空值.我使用com.fasterxml.jackson.databind中的ObjectMapper将我的JSON对象转换为String.
private ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(object);
Run Code Online (Sandbox Code Playgroud)
如果我的对象包含任何包含值为null的字段,则该字段不包含在来自writeValueAsString的String中.我希望我的ObjectMapper给我字符串中的所有字段,即使它们的值为null.
例:
object = {"name": "John", "id": 10}
json = {"name": "John", "id": 10}
object = {"name": "John", "id": null}
json = {"name": "John"}
Run Code Online (Sandbox Code Playgroud) 我通过Java注释生成的JSON swagger文档遇到了一些麻烦(REST使用Jersey公开,序列化由jackson处理).查看生成的swagger,它包含空值,这会导致swagger UI崩溃(生成的YAML没有此问题).
这里是JSON的摘录:
{
"swagger": "2.0",
"info": { "description": null, "version": "1.0.0", "title": "", "termsOfService": null, "contact": null, "license": null },
"host": "localhost:8080",
"basePath": "/api",
"tags": [ { "name": "dataset", "description": null, "externalDocs": null } ],
"schemes": [ "http" ],
"consumes": null,
"produces": null,
"paths": {
"/dataset": {
"get": {
"tags": ["dataset"],
"summary": "A dataset",
"description": "All the available datasets",
"operationId": "datasetGet",
"schemes": null,
"consumes": null,
"produces": ["application/json"],
"parameters": [],
"responses": {
"200": {
"description": "Available datasets",
"schema": { …Run Code Online (Sandbox Code Playgroud) 我对JAXB/Jackson编组有一个问题.我有这样的注释
@XmlAttribute(name = "private")
protected Boolean mPrivate;
Run Code Online (Sandbox Code Playgroud)
如果mPrivate变量是,我希望这个属性不存在null.
如果输出是XML,这可以正常工作.但如果我使用杰克逊切换到JSON,输出就是
xxxxxxx, "private":null, xxxxxxxx
Run Code Online (Sandbox Code Playgroud)
任何人都知道为什么会发生这种情况以及如何解决这个问题?提前致谢.
我使用Jersey 2.17和Moxy,我有以下功能:
@Produces(APPLICATION_JSON)
@Restricted
public List<User> getFriends(
@PathParam("user") String user
) {
return userDAO.getFriends(user);
}
Run Code Online (Sandbox Code Playgroud)
User.preferences是一个HashMap.
它适用于几乎所有对象,除了HashMap被转换为:
"偏好":{ "条目":[{ "键":{ "类型": "串", "值": "语言"}, "值":{ "类型": "串", "值": "恩"}},{ "关键":{ "类型": "串", "值": "国"}, "值":{ "类型": "串", "值": "US"} }]}
但我真正想要返回的只是一个javascript对象,如:
喜好:{ "语言": "恩", "国": "US"}
我怎样才能做到这一点?
我有一个TeamResponse类用于形成JSON响应.它有一些参数,其中一个可以是可选的:
public TeamResponse(Team team, List<TeamSkillTemplateResponse> teamSkillTemplateResponses) {
this.id = team.getId();
this.name = team.getName();
this.department = new DepartmentResponse(team.getDepartment());
this.division = new DivisionResponse(team.getDepartment().getDivision());
this.valueStream = team.getValueStream().map(ValueStreamResponse::new).orElseGet(null);
this.skillTemplate = teamSkillTemplateResponses;
}
Run Code Online (Sandbox Code Playgroud)
我实际上有两个问题:1.如果值不存在,在响应中返回null是否合适?2.以这种方式返回null是否合适?(方法getTeam()返回Optional)
谢谢.
我正在使用RESTEasy通过JSON在我的rest api上发送对象.它非常方便 - 每个字段都自动填充在JSON对象中.但是有一些领域(例如passwordhash)我宁愿不发送.我也想删除任何空值 - 没有必要发送它们.
我可以影响JSON的创建方式吗?
我正在使用Jettison,RESTEasy 2.0.1.GA,我认为,JAXB,虽然我真的很难确定这一点.
我想要做的是避免我的请求中的空字段.我使用Jersey依赖项
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>1.18</version>
</dependency>
<dependency>
<groupId>com.sun.jersey.contribs</groupId>
<artifactId>jersey-multipart</artifactId>
<version>1.17</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.5.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
这是我的泽西配置
Client client = ClientBuilder
.newClient()
.register(authenticationFeature)
.register(CustomTypeProvider.class)
.register(MultiPartWriter.class)
.register(JacksonFeature.class);
Run Code Online (Sandbox Code Playgroud)
这就是我要发送的内容
{
"locale": "en_US",
"file": {
"file": {
"version": null,
"permissionMask": null,
"creationDate": null,
"updateDate": null,
"label": "my.properties",
"description": null,
"uri": null,
"type": "prop",
"content": null
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是我需要
{
"locale": "en_US",
"file": {
"file": {
"label": "my.properties",
"type": "prop",
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何从我的请求中排除所有空字段?
我nullPointer在getter方法中遇到问题.
这是代码:
public String getTitle()
{
if(!title.isEmpty())
return title;
else
return "foo";
}
Run Code Online (Sandbox Code Playgroud)
当我将其更改为普通吸气剂时,它可以完美地工作.
public String getTitle()
{
return title;
}
Run Code Online (Sandbox Code Playgroud)
诀窍在哪里?有反射技巧吗?
更新问题不是空检查,而是在没有调用它的情况下执行getter
堆栈跟踪
org.codehaus.jackson.map.JsonMappingException: (was java.lang.NullPointerException) (through reference chain: java.util.ArrayList[0]- >si.mikropis.webkiosk.model.vao.wine.Wine["title"])
Caused by: java.lang.NullPointerException
at si.mikropis.webkiosk.model.vao.base.BaseModel.getTitle(BaseModel.java:41)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.codehaus.jackson.map.ser.BeanPropertyWriter.get(BeanPropertyWriter.java:483)
at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:418)
at org.codehaus.jackson.map.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:150)
... 32 more
我有一个系统,其中显式null字段与 JSON 中不存在的字段不同。用 Java 表示 Jackson 序列化的最佳方式是什么?
例如,我有一个像
class Data {
public String string;
public String other;
}
Run Code Online (Sandbox Code Playgroud)
默认情况下,Jackson 序列化空字段,因此new ObjectMapper().writeValueAsString(new Data())结果为{"string":null,"other":null}. 但是,我希望这会导致{}字段“未设置”。显然,在 Java 中它们为空,但我正在寻找解决方法。
如果我这样做new ObjectMapper().wirteValueAsString(new Data(null, null)),我想这导致{"string":null,"other":null}。并且只有“字符串”字段导致{"string":"value"}.
我现在能想到的唯一方法是为每个字段设置布尔值并使用自定义序列化程序来检查布尔值,但这看起来很混乱。有没有更简单的方法来做到这一点?
编辑:这不是不序列化空值。如果字段显式设置为空,我希望空值被序列化。
我想也许我可以使用 Optionals 和 Include.NON_ABSENT,但不幸的是,这也不起作用,因为 Jackson 将 Optional 引用null视为与Optional.empty().