java - 杰克逊注释无法解析布尔字段
问题描述
我的Java类对应的数据如下,
package com.some.package;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.gson.reflect.TypeToken;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.lang.reflect.Type;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class A {
public static final Type UNMARSHALLER_TYPE = new TypeToken<A>(){}.getType();
@JsonProperty("id")
String id;
@JsonProperty("name")
String name;
@JsonProperty("is_enabled")
boolean isEnabled;
}
我写的测试用例类失败了,因为 isEnabled 总是false
package com.some.package;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;
import org.junit.Test;
import java.io.IOException;
import static org.junit.Assert.*;
/**
* Created by tanny on 16/11/19.
*/
public class ATest {
private static final String RESPONSE_JSON = "{\"is_enabled\": true, \"name\": \"XXX\", \"id\":\"mock-id\", \"num\":12}";
@Test
public void testAUnmarshaller() throws IOException {
// given
PapiSite payload = new Gson().fromJson(RESPONSE_JSON, A.UNMARSHALLER_TYPE);
// then
assertNotNull(payload);
assertTrue(payload.isEnabled());
assertEquals("XXX", payload.getName());
}
}
看起来杰克逊数据绑定器无法解析测试中传递的 json 字符串。有没有可能我做错了什么?任何帮助或指导将不胜感激。
解决方案
问题是您正在混合两个不同的库, jackson
并且JsonProperty,JsonIgnoreProperties属于,并且您正在尝试在测试用例中使用Gson进行解析Gson
jackson
使用 Gson :您可以在使用 Gson 时使用@SerializedName ,您可以在此处找到有关 Gson的更多信息
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class A {
public static final Type UNMARSHALLER_TYPE = new TypeToken<A>(){}.getType();
@SerializedName("id")
String id;
@SerializedName("name")
String name;
@SerializedName("is_enabled")
boolean isEnabled;
}
使用 Jackson:您可以使用ObjectMapper,您可以在此处找到有关 jackson的更多信息
@Test
public void testAUnmarshaller() throws IOException {
// given
ObjectMapper objectMapper = new ObjectMapper();
PapiSite payload = objectMapper.readValue(RESPONSE_JSON, A.class);
// then
assertNotNull(payload);
assertTrue(payload.isEnabled());
assertEquals("XXX", payload.getName());
}
推荐阅读
- javascript - 在 div 中加载 JS 函数
- python - Markdown:恢复分隔符中捕获的空格
- java - 如何使用带有 Quarkus 的 Vertx 路由器将所有未找到的路由重定向到 index.html?
- javascript - React:如何在我无法控制的功能组件中使用 refs(即来自库)
- c# - C# 加入动态列
- django - Django:我无法发现的视图中的 TypeError
- matlab - 如何对复数使用 Shuffle.c 索引模式
- node.js - NW.js / Node.js 使用 node-mssql 时抛出“SSL 例程:ssl_choose_client_version:unsupported protocol”错误 / 乏味
- swift - 在不增加堆栈宽度的情况下更改文本宽度
- google-apps-script - 使用 Google Apps 脚本从文本中删除脚注索引或上标