如何通过一个POJO处理不同的数据



我正试图为不同的JSON数据创建一个POJO。有没有办法只通过一个类来实现这一点?并且不写序列化程序和反序列化程序?

结果二示例:

{ "results": ["24","0","18","34","27"] }

ResultOne示例:

{
"results": [
{
"value": "2|2|5"
},
{
"value": "2|3|4",
"multiplier": 25
},
{
"value": "2|3|5"
},
{
"value": "2|3|4",
"multiplier": 50
},
{
"value": "1|1|4"
},
{
"value": "3|6|6",
"multiplier": 30
}
]
}

我尝试过的:

基本结果

public class BaseResult { }

ResultOne

@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ResultOne extends BaseResult {
//    {"value":"2|6|6","multiplier":25}
//    or
//    {"value":"4|4|4"}
private String value;
private Integer multiplier;
}

ResultTwo

@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ResultTwo extends BaseResult {
private String result;
}

ResultSerializer

public class ResultSerializer extends StdSerializer<BaseResult> {
public ResultSerializer(Class<BaseResult> t) {
super(t);
}
@Override
public void serialize(
BaseResult value, JsonGenerator gen, SerializerProvider arg2)
throws IOException {
if(value instanceof ResultTwo){
ResultTwo result = (ResultTwo)value;
gen.writeString(result.getResult());
}else if(value instanceof ResultOne){
ResultOne resultOne = (ResultOne)value;
gen.writeObject(resultOne);
}else{
throw new ClassCastException("BaseResult value doesn't have any known type: " + value);
}
}
}

结果反序列化程序

public class ResultDeserializer
extends StdDeserializer<BaseResult> {
public ResultDeserializer(Class<?> vc) {
super(vc);
}
@Override
public BaseResult deserialize(
JsonParser jsonparser, DeserializationContext context)
throws IOException {
String content = jsonparser.getText();
JsonNode node = jsonparser.getCodec().readTree(jsonparser);
if(node instanceof ObjectNode){
ObjectMapper objectMapper = new ObjectMapper();
return objectMapper.treeToValue(node, ResultOne.class);
}else{
ResultTwo resultTwo = new ResultTwo();
resultTwo.setResult(content);
return resultTwo;
}
}
}

在父类上,我注释了以下内容:

@JsonSerialize(contentUsing = ResultSerializer.class)
@JsonDeserialize(contentUsing = ResultDeserializer.class)
private List<BaseResult> results = null;

@Kulsin-在弹簧控制器中,您可以使用Map<字符串,对象>作为请求主体,它可以受理您的两个请求-

@RequestMapping(value = "/test", method = RequestMethod.POST, consumes = "application/json", produces = "application/json")
public void testMethod(@RequestBody Map<String, Object> request) {
//access data using request reference.
}

最新更新