如何使用Jackson有条件地反序列化为POJO字段?

时间:2017-05-18 08:45:30

标签: java jackson

如何有条件地将JSON字符串反序列化为POJO字段?

我收到一个类似的JSON字符串:

{
 "status": "we stuck",
 "data" : "someData"
}

但是“someData”可以只是“桥下”的字符串,也可以是“['桥5','曼德拉桥']”或“[{'事件1':'['桥1' ,'桥2]'},{'事件2':['桥99','还有什么']}]“

如果“data”是一个数组,我想返回json字符串AS然后我将映射到处理数组的其他Type

我有一个java类:

class Response {
  String status;
  String data;
}

另一个类型的数据为

ArrayList<SomeOtherType> data;

这是我到目前为止所拥有的

 ObjectMapper mapper = new ObjectMapper();
 Response rspns = mapper.readValue(<theJSONStrHere>, Response.class);

当数据是一个数组时,这会失败,给我一条消息

  

无法从START_ARRAY标记

中反序列化java.lang.String的实例

我不知道从哪里开始。

3 个答案:

答案 0 :(得分:1)

您可以像aussie所说的那样使用自定义反序列化程序,也可以只修改工作解决方案。

class Response {
  String status;
  String data;
}

class Other {
  String status;    
  ArrayList<SomeOtherType> data;
}

ObjectMapper mapper = new ObjectMapper();
Other rspns = mapper.readValue(<theJSONStrHere>, Other.class);

这将使用ArrayList将JSON String解析为Other类。 现在轮到你实施决定使用

Other rspns = mapper.readValue(<theJSONStrHere>, Other.class);

或何时使用

Responserspns = mapper.readValue(<theJSONStrHere>, Response.class);

注意:以上是一个快速而肮脏的解决方案。它的工作方式与此类似,但我强烈建议使用自定义反序列化器,它可以处理它的逻辑和返回的内容。 另外请记住,为了最好地工作,您可以考虑将POJO结构构建为多个类,这些类扩展了基类,然后是通用的。

示例:

class response {
  String status;
}

class simpleResponse extends response {
  String data;
}

class listResponse extends response {
  ArrayList<Type> data;
}

class MyDeserializer extends JSONDeserializer<E extends response> {
   public E deserialize...) {

   }
}

要获得有关Jackson

的实际工作示例

答案 1 :(得分:0)

不要让它变得复杂简单......

有两种方式

首先以列表字符串/(或任何其他类型)

private List<String> tags;

第二次获取课程列表(如果您需要多个参数)

List<PageLink> pagelinks;

见下面的案例......

public class PagesJson {
    private String ln;
    private int pageno;
    private List<String> tags;
    private List<PageLink> pagelinks;
    private String error;
}

public class PageLink {
    private String title= null;
    private String url;
}

现在json的 PagesJson 类如下

{&#34; LN&#34;:EN,&#34;计数&#34;:100,&#34;观看次数&#34;:23,&#34;您做生意&#34;:17,&# 34;标签&#34;:[&#34;确保安全孕产&#34;,&#34;孕妇健康&#34;,&#34;堕胎&#34;],&#34; pagelinks&#34;: [{&#34;标题&#34;:&#34;流产&#34;&#34; URL&#34;:&#34; http://vikaspedia.in/health/women-health&#34;},{&#34;标题& #34;:&#34;行为和规则&#34;,&#34; url&#34;:&#34; http://vikaspedia.in/social-welfare/scheduled-tribes-welfare/acts-and-rules&#34;},{&#34; title&#34;:& #34;行为和规则&#34;,&#34; url&#34;:&#34; http://vikaspedia.in/social-welfare/unorganised-sector-1/acts-and-rules&#34;}],&#34;错误&#34;:&#34;参数验证错误&#34;}

{"ln":en,"count":100,"viewcount":23,"pageno":17,"tags":["Ensuring safe motherhood","pregnancy health in women","Abortion"],"pagelinks":[{"title":"Abortion","url":"http://vikaspedia.in/health/women-health"},{"title":"Acts and Rules","url":"http://vikaspedia.in/social-welfare/scheduled-tribes-welfare/acts-and-rules"},{"title":"Acts and Rules ","url":"http://vikaspedia.in/social-welfare/unorganised-sector-1/acts-and-rules"}],"error":"Parameter Validation Error"}

要将json映射到类,请使用 jackson 库,如下所示.....

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
....
.....
ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

PagesJson pj = mapper.readValue(response.toString(), PagesJson.class);

答案 2 :(得分:0)

您可以在下面的方法或类上使用自定义反序列化器:

extends JsonDeserializer

然后

@Override
public ReturnObject deserialize(JsonParser parser, DeserializationContext ctx)
        throws IOException, JsonProcessingException {

        JsonToken token = parser.getCurrentToken();
        if(JsonToken.START_ARRAY.equals(token)){
        //TODO your JSON Array code handling
        }else{
        //TO DO you JSON Object Handling
        }
}