fastjson 自定义String.class的ObjectDeserializer不起作用,并且有一个很奇怪的情况

uyto3xhc  于 2021-11-27  发布在  Java
关注(0)|答案(3)|浏览(393)

按照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":""}";

2sbarzqh

2sbarzqh1#

打断点看看传空字符串的时候 val的时候是什么东西,或者可能根本没走你这个解析器

ut6juiuv

ut6juiuv2#

@ma349432587 正常的json格式确实没走自己定义的解析器,要么是asm生成的解析器,要么是javaBeanDeserializer。奇怪的是当我输入一个{"notexist":"","id":"001","desc":""}时,就能进自己定义的解析器。

ef1yzkbh

ef1yzkbh3#

String内置实现做了特别优化,所以定制序列化支持不彻底,这个可以补上

相关问题