按照ObjectDeserializer注解上的方法,自定义了一个MyStringDeser
public class MyStringDeser implements ObjectDeserializer {
@Override
public <T> T deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
final JSONLexer lexer = parser.getLexer();
if (lexer.token() == JSONToken.LITERAL_STRING) {
String val = lexer.stringVal();
lexer.nextToken(JSONToken.COMMA);
// 如果是空字符串,希望返回null
if(val == null || "".equals(val.trim())){
return null;
}
return (T)val;
}
return null;
}
@Override
public int getFastMatchToken() {
return JSONToken.LITERAL_STRING;
}
}
并且注册进ParserConfig里
ParserConfig.getGlobalInstance().putDeserializer(String.class, new MyStringDeser());
以下是测试代码:
import lombok.Data;
@DaTa
public class VO {
private String id;
private String desc;
}
public class JsonUtilsTest {
@Before
public void config(){
ParserConfig.getGlobalInstance().putDeserializer(String.class, new MyStringDeser());
}
@Test
public void test(){
String json = "{\"id\":\"001\",\"desc\":\"\"}";
VO vo;
vo = JSON.parseObject(json, VO.class);
// 期待输出VO(id=001, desc=null)
// 实际上输出的是VO(id=001, desc=)
// 自定义的MyStringDeser并没有被调用
System.out.println(vo);
}
// 下面是非常奇怪的事情
@Test
public void odd(){
// 在json的最前面加一个逗号“,”
String json = "{,\"id\":\"001\",\"desc\":\"\"}";
VO vo;
vo = JSON.parseObject(json, VO.class);
// 输出的是VO(id=001, desc=null)
System.out.println(vo);
}
}
wenshao @wenshao 能帮我看看么?其实不止加一个逗号,只要加一个不存在的字段都可以。
比如:String json = "{"notexist":"","id":"001","desc":""}";
3条答案
按热度按时间2sbarzqh1#
打断点看看传空字符串的时候 val的时候是什么东西,或者可能根本没走你这个解析器
ut6juiuv2#
@ma349432587 正常的json格式确实没走自己定义的解析器,要么是asm生成的解析器,要么是javaBeanDeserializer。奇怪的是当我输入一个{"notexist":"","id":"001","desc":""}时,就能进自己定义的解析器。
ef1yzkbh3#
String内置实现做了特别优化,所以定制序列化支持不彻底,这个可以补上