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

Java 如何使用Jackson有条件地反序列化到POJO字段?,java,jackson,Java,Jackson,如何有条件地将JSON字符串反序列化到POJO字段 我收到一个JSON字符串,如下所示: { "status": "we stuck", "data" : "someData" } 但是“someData”可以只是“桥下”的一个字符串,也可以是类似“['bridge 5','Mandela bridge']”或“[{'incident 1':'['bridge 1','bridge 2]},{'incident 2':['bridge 99','what ever']}”的字符串。” 我想

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

我收到一个JSON字符串,如下所示:

{
 "status": "we stuck",
 "data" : "someData"
}
但是“someData”可以只是“桥下”的一个字符串,也可以是类似“['bridge 5','Mandela bridge']”或“[{'incident 1':'['bridge 1','bridge 2]},{'incident 2':['bridge 99','what ever']}”的字符串。”

我想按原样返回json字符串,如果“data”是一个数组,那么我将映射到处理该数组的不同类型

我有一个java类:

class Response {
  String status;
  String data;
}
另一种类型的数据如下所示

ArrayList<SomeOtherType> data;
ArrayList数据;
这就是我目前所拥有的

 ObjectMapper mapper = new ObjectMapper();
 Response rspns = mapper.readValue(<theJSONStrHere>, Response.class);
ObjectMapper mapper=new ObjectMapper();
Response rspns=mapper.readValue(,Response.class);
当数据是数组时,这会失败,并给出消息

无法反序列化START_数组令牌中的java.lang.String实例


我不知道从这里走到哪里。

不要把事情复杂化,简单化

有两种方法

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

要将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);

您可以像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);
或何时使用

Responserspns = mapper.readValue(<theJSONStrHere>, Response.class);
Responserspns=mapper.readValue(,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...) {

   }
}
类响应{
字符串状态;
}
类simpleResponse扩展了响应{
字符串数据;
}
类listResponse扩展了响应{
阵列列表数据;
}
类MyDeserializer扩展JSONDeserializer{
公共文件(E反序列化…){
}
}

要获得实际的工作示例,请阅读

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

extends JsonDeserializer
然后


没有关于如何检索值的实际示例。最重要的部分是缺少提醒的银行@Nico我已经更新了如何将json映射到类。。。要将json映射到类,请使用jackson LibraryThank,Piyus,但情况与我的类似。假设标签也可以是“没有标签”。。PagesJson中的标记是一个只包含一个元素“the are no tags”的列表还是无法反序列化?我无法控制json字符串I receiveYes标记将接受一个字符串作为带有一个元素的列表,并且……如果没有标记为json……列表将为null或空白……您只需要使用……创建ObjectMapper对象。。。。反序列化功能。失败\u 0N\u未知\u属性为False这是否意味着MyDeserializer将自动选择要返回的响应子类?理论上是的,但它返回的逻辑必须由您在反序列化器中实现。因此,无论发生什么,您都必须构建逻辑,但反序列化器将具有在一个位置拥有此逻辑的优势。这意味着你可以随时随地使用它。这种层次结构的优点是,您可以将基类
response
与所需的一切放在一起,并让它被子类覆盖。例如,
response
中的函数
getData()
,它返回一个对象。但是子类会用它们的特定类型覆盖这个方法。因为反序列化程序将返回泛型(例如
E
),如果您检索json,那么您的代码中将得到
E
,然后可以将其转换为基类
response
,或者您可以使用反射定义确切的子类,如
if(simpleResponse的结果实例){simpleRespone casted=(simpleRespone)result;}
。如果您不了解泛型或从未对这些类型的变量/对象做过任何操作,我建议您阅读本主题。
class Response {
  String status;
  String data;
}

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

ObjectMapper mapper = new ObjectMapper();
Other rspns = mapper.readValue(<theJSONStrHere>, Other.class);
Other rspns = mapper.readValue(<theJSONStrHere>, Other.class);
Responserspns = mapper.readValue(<theJSONStrHere>, Response.class);
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...) {

   }
}
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
        }
}