如何有条件地将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的实例
我不知道从哪里开始。
答案 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
}
}