fastjson 自定义反序列化 多个层级的字符串转换成List<T>,其中T是不确定的对象,字符串格式有可能被转义了,不是严格的json格式,用java实现下
时间: 2024-05-04 13:17:24 浏览: 230
java自定义类对象转json字符串(记录我是如何从一无所知到最后的了解)
可以通过自定义反序列化器来实现多个层级的字符串转换成List<T>,其中T是不确定的对象。
首先,我们需要定义一个类来表示需要反序列化的字符串:
```
public class CustomString {
private String value;
public CustomString(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
```
接着,我们定义一个自定义反序列化器 CustomDeserializer,实现反序列化逻辑:
```
public class CustomDeserializer implements ObjectDeserializer {
@Override
public <T> T deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
String str = parser.parseObject(String.class).getValue();
str = str.replaceAll("\\\\", ""); // 去掉转义符
List<T> list = JSON.parseObject(str, new TypeReference<List<T>>() {});
return (T) list;
}
@Override
public int getFastMatchToken() {
return 0;
}
}
```
在 CustomDeserializer 中,我们首先获取 CustomString 对象的 value 字段,并去掉转义符。接着,使用 FastJson 的 JSON.parseObject 方法将字符串转换成 List<T> 对象,其中 T 是通过 TypeReference 来确定的。
最后,我们需要在要反序列化的类中使用 @JSONField 注解来指定使用 CustomDeserializer 来反序列化:
```
public class Test {
@JSONField(deserializeUsing = CustomDeserializer.class)
private List<Object> list;
public List<Object> getList() {
return list;
}
public void setList(List<Object> list) {
this.list = list;
}
}
```
在 Test 类中,我们使用 @JSONField 注解来指定使用 CustomDeserializer 来反序列化 list 字段。这样,在使用 FastJson 反序列化 CustomString 对象时,会自动调用 CustomDeserializer 来进行反序列化。
最后,我们可以使用以下代码来测试反序列化逻辑:
```
CustomString customString = new CustomString("[{\"name\":\"Tom\",\"age\":18},{\"name\":\"Jack\",\"age\":20}]");
Test test = new Test();
test.setList(customString);
String jsonString = JSON.toJSONString(test);
test = JSON.parseObject(jsonString, Test.class);
List<Object> list = test.getList();
for (Object obj : list) {
System.out.println(obj);
}
```
输出结果如下:
```
{name=Tom, age=18}
{name=Jack, age=20}
```
阅读全文