我正在使用Jackson JSON库将一些JSON对象转换为Android应用程序上的POJO类.问题是,JSON对象可能会更改并在应用程序发布时添加新字段,但是当添加一个简单的String字段时,它会崩溃,这可以安全地忽略.
有没有办法告诉杰克逊忽略新添加的字段?(例如,POJO对象上不存在)?全球忽视将是伟大的.
我有一个Java类MyPojo
,我有兴趣从JSON反序列化.我已经配置了一个特殊的MixIn类MyPojoDeMixIn
,以帮助我进行反序列化.MyPojo
只有int
和String
实例变量结合适当的getter和setter.MyPojoDeMixIn
看起来像这样:
public abstract class MyPojoDeMixIn {
MyPojoDeMixIn(
@JsonProperty("JsonName1") int prop1,
@JsonProperty("JsonName2") int prop2,
@JsonProperty("JsonName3") String prop3) {}
}
Run Code Online (Sandbox Code Playgroud)
在我的测试客户端中,我执行以下操作,但当然它在编译时不起作用,因为存在JsonMappingException
与类型不匹配相关的问题.
ObjectMapper m = new ObjectMapper();
m.getDeserializationConfig().addMixInAnnotations(MyPojo.class,MyPojoDeMixIn.class);
try { ArrayList<MyPojo> arrayOfPojo = m.readValue(response, MyPojo.class); }
catch (Exception e) { System.out.println(e) }
Run Code Online (Sandbox Code Playgroud)
我知道我可以通过创建一个只包含其中的"Response"对象来缓解这个问题ArrayList<MyPojo>
,但是我必须为我想要返回的每个类型创建这些有些无用的对象.
我还在线查看了JacksonInFiveMinutes,但是很难理解有关Map<A,B>
我的问题以及它与我的问题有什么关系.如果你不能说,我是Java的新手,来自Obj-C背景.他们特别提到:
除了绑定到POJO和"简单"类型之外,还有一个附加变体:绑定到通用(类型)容器的变体.这种情况需要特殊处理,因为所谓的类型擦除(Java用于以某种向后兼容的方式实现泛型),这会阻止您使用类似Collection.class(不能编译)的东西.
因此,如果要将数据绑定到Map,则需要使用:
Map<String,User> result = mapper.readValue(src, new TypeReference<Map<String,User>>() { });
Run Code Online (Sandbox Code Playgroud)
我怎样才能直接反序列化ArrayList
?
当我尝试将Json解析为Java pojo对象时,我收到此异常.对象图有几个对象.
org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "id" (Class Criteria), not marked as ignorable
Run Code Online (Sandbox Code Playgroud)
我想看看,在这种情况下会出现这种异常,问题可能出在对象图中?
我在我的android项目中这样做我在这里没有使用注释我不知道如何将此字段添加为可忽略的.
(注:我已经看到关于“Jackson 抱怨无法识别的属性”主题的多个问题的回答,但我没有找到专门使用 RestAssured 的对象映射器的问题)
我有 RestAssured 测试,它有效
@Test
public void objectMappingRelyingOnClassAnnotation() {
User user = RestAssured.get("https://api.github.com/users/andrejss88")
.as(User.class); // must have 'jackson-databind' dependency
Assert.assertEquals(user.login, "andrejss88");
}
Run Code Online (Sandbox Code Playgroud)
它之所以有效,是因为该类已注释,如下所示:
@JsonIgnoreProperties(ignoreUnknown = true)
public class User {
public String login;
public int id;
}
Run Code Online (Sandbox Code Playgroud)
但是,我想使用使用重载方法的替代方法as()
,并在不使用注释的情况下传入我自己的映射器:
<T> T as(Class<T> cls, ObjectMapper mapper);
Run Code Online (Sandbox Code Playgroud)
但杰克逊的映射器不起作用:
@Test
public void objectMappingUsingSpecifiedMapper() {
// Doesn't compile - Jackson's ObjectMapper != RestAssured's Mapper
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
AnotherUser user = RestAssured.get("https://api.github.com/users/andrejss88")
.as(AnotherUser.class, objectMapper); …
Run Code Online (Sandbox Code Playgroud) 我正在使用Jersey 1.0 http-client调用资源并反序列化响应JSON,如下所示:
Client client = Client.create(new DefaultClientConfig())
ClientResponse clientResponse = client.resource("http://some-uri").get(ClientResponse.class)
MyJsonRepresentingPOJO pojo = clientResponse.getEntity(MyJsonRepresentingPOJO.class)
Run Code Online (Sandbox Code Playgroud)
现在,响应JSON具有一些新字段,并且出现以下异常:
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "xyz"
Run Code Online (Sandbox Code Playgroud)
如何将杰克逊的反序列化模式更改为NON-STRICT,以便它将忽略新字段?
这是我的POJO课。
public class Product implements ParentListItem {
private String ProductName;
private int ProductID;
private String ProductImagePath;
private String BrandName;
private int BrandID;
private String SubCategoryName;
private int SubCategoryID;
private List<ProductVariant> Variants = new ArrayList<>();
Product(){}
}
Run Code Online (Sandbox Code Playgroud)
Json格式:
[{
"Variants": [{
"VariantID": "1",
"VariantName": "50 GM",
"VariantImagePath": null,
"MRP": "19.00",
"SellPrice": "18.24",
"InCart": "0"
}],
"ProductName": "Body Cleanser - Lemon Honey Kanti",
"ProductID": "1",
"BrandName": "Patanjali",
"SubCategoryID": "44",
"SubCategoryName": "Bathing Soap",
"ProductImagePath": "\/images\/patanjali\/1819.png",
"BrandID": "112"
}]
Run Code Online (Sandbox Code Playgroud)
我正在尝试像这样使用此POJO。
for (DataSnapshot postSnapshot : …
Run Code Online (Sandbox Code Playgroud) jackson ×6
json ×5
java ×4
android ×2
annotations ×1
firebase ×1
jersey ×1
jersey-1.0 ×1
mapping ×1
pojo ×1
rest-assured ×1