- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用来自外部合作伙伴的 API。不幸的是,返回的响应似乎没有固定的结构。理想情况下,API 契约意味着它不会被违反,但这种情况一直在发生。
无论如何,JSON 响应中的一个字段主要是一个映射,但有时,出乎意料的是一个列表。
例如,假设以下是我通常得到的响应:
{
"majorInfo" : {
"a" : "b"
},
"minorInfo" : {
"c" : "d"
}
}
但在极少数情况下,我会得到一个列表而不是 map 或其他一些违反契约(Contract)的行为。
例如:
{
"majorInfo" : {
"a" : "b"
},
"minorInfo" : []
}
我正在使用 jackson 将此响应映射到 POJO。在某些情况下,当违反契约(Contract)时,我会收到错误,
Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.LinkedHashMap out of START_ARRAY token
在这种情况下,即使遵守契约(Contract),我也会丢失字段 majorInfo 中的信息。当一个字段不遵守契约(Contract)时,有什么办法可以忽略它吗?在这种情况下,我的 POJO 的 majorInfo 成员将被正确设置,但 minorInfo 成员将为空。
我知道 @JsonIgnoreProperties(ignoreUnknown = true) 但那会总是忽略 minorInfo 字段。我只希望在该领域不遵守契约(Contract)时忽略它。这可能吗?
我也试过
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
但这也不起作用。
还有其他解决方案吗?外部合作伙伴肯定不会为我们更改他们的 API。那么,我们有什么可行的解决方案吗?
谢谢
编辑:一种解决方案是我对这两种变体都有一个 POJO,并将代码放在 try catch block 中。如果 JSON 响应只有一个字段违反了约定并且仅以一种特定方式,那么这可能会奏效。我实际上得到的回应是巨大的,这是我在第三场发现的第三次违规。我不能继续放置 try catch block ,到第三次违规时,我意识到最好的办法是忽略违反它的字段。
最佳答案
我使用以下线程作为引用找到了解决方案: Jackson: ignoring properties instead of throwing JsonMappingException
我写了一个自定义反序列化器并用它来忽略错误。
public class CustomListingDeserializer extends JsonDeserializer<Map<String, Listing>>{
public CustomListingDeserializer() {
// TODO Auto-generated constructor stub
}
@Override
public Map<String, Listing> deserialize(JsonParser arg0, DeserializationContext arg1)
throws IOException, JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
JsonNode node = arg0.readValueAsTree();
try
{
return mapper.readValue(node.toString(), new TypeReference<Map<String,Listing>>(){});
}
catch (JsonMappingException e)
{
System.out.println("Issue in deserializing : " + e.getMessage() + "for :" + node.toString());
}
catch (Exception e)
{
throw e;
}
// TODO Auto-generated method stub
return null;
}
}
关于java - 忽略 "Can not deserialize instance of java.util.LinkedHashMap out of START_ARRAY token"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35574843/
我需要像这样反序列化 Json: { "arrayObj1":[ { "type":"t1", "value":[
我正在编写一个使用 robospice、retrofit 和 Jackson 2.4.X 的 Android 应用程序, 这是我试图反序列化从休息服务返回的 json。返回的“data”数组中的元素是
我在从我们从 EXTJS 存储发送的 JSON 文件中反序列化多个任务(数据)时遇到问题。在更新单个任务时它的工作正常。但是当我们更新多个任务时,它会显示 org.codehaus.jackson.m
我有两个对象,一个是 Dashboard,第二个是 Room 我有一个 json,看起来像这样 { "hotel_id":"1", "hotel_room":"200", "hotel_prope
我在尝试解析之前使用 Jackson 生成的一些 JSON 时收到此错误。我像这样生成 JSON String ret = ""; ret = mapper.writeValueAsString(me
我需要向网络服务发送一个发布请求,但它返回以下异常 java.io.IOException: Server returned HTTP response code: 500 for URL doma
谁能说我哪里做错了。我有这样的 json [{"name":"foo","slug":"foo2","locales":["foo3"],"hostname":"foo4","region_tag":
我是 Spring Boot 和 API 的新手,我正在开发一个项目,尽管我的 Spring Boot 应用程序与 MySQL 数据库连接,但我需要从公共(public) API 获取数据并将其存储到
我正在尝试使用 jackson api 解析 json,并包含以下详细信息。但我收到错误。请查找以下代码和堆栈跟踪详细信息。 JSON [{"id":1001,"cyPerReffe":1200,"d
我正在尝试将我的 json 请求解析为我的模型。我不知道,这段代码有什么问题。 json 的语法看起来是正确的,Java 模型上的注释也是如此。我不知道为什么我会收到如下错误: Caused by:
我有一个 SpringBoot 应用程序。使用此配置文件: @Configuration public class ApplicationConfig { @Bean public R
我有一个带有restTemplate调用的方法,如下所示: restTemplate.getForObject(apiUrl ,Someclass.class); Someclass.class: @
我正在尝试通过 jQuery AJAX 将对象数组发送到 Spring Controller 。这是 JavaScript 代码: var data = new Array(); $.
我在这个问题上遇到了同样的问题,很高兴看到这个问题已经有了解决方案。但我无法在我的代码中实现它。 ( Cannot deserialize instance of object out of STAR
我正在尝试为我的索引更新文档,并在通过 Postman 更新 API 脚本时收到以下错误 { "error": { "root_cause": [ {
直接开始... 我有一个返回字符串的方法(请参阅下面的示例字符串) - 本质上,我向 URL 发出 HTTP GET 请求,响应是下面的字符串... { "total": 30, "rows"
我有一个像这样的json: { "games": [ { "id": "mhhlhlmlezgwniokgawxloi7mi", "from": "42
我知道 stackoverflow 上有一些关于这个问题的问题。但我花了几个小时试图解决这个错误,但没有成功。 我使用 mysql 数据库来存储值。 我不断收到来自com.example.spring
JSON 片段如下: "text": {"paragraph": [ "For use in manufacturing only.",
我必须从 servlet 中收到的 JSON 字符串创建 Java 对象下面是 JSON [{"name":"name","value":"Shital"},{"name":"email","valu
我是一名优秀的程序员,十分优秀!