[alibaba/fastjson]反序列化支持null转空字符串吗,如果支持该怎么做。

2024-09-06 414 views
4

目前找到两个自定义的序列化手段。

  1. ObjectDeserializer
  2. ExtraProcessable 都不太适用。

回答

2

hi @Hireek ,这个问题是支持的,可以通过SerializerFeature序列化属性来设置序列化,相关属性枚举如下:

QuoteFieldNames   // 输出key时是否使用双引号,默认为true 
WriteMapNullValue     //是否输出值为null的字段,默认为false 
WriteNullNumberAsZero    //数值字段如果为null,输出为0,而非null 
WriteNullListAsEmpty   //List字段如果为null,输出为[],而非null 
WriteNullStringAsEmpty   //字符类型字段如果为null,输出为”“,而非null 
WriteNullBooleanAsFalse   //Boolean字段如果为null,输出为false,而非null
9

补充如下:

String str = JSON.toJSONString(obj, SerializerFeature.WriteNullStringAsEmpty);
9

test demo 3939

9

hi @Hireek ,这个问题是支持的,可以通过SerializerFeature序列化属性来设置序列化,相关属性枚举如下:

QuoteFieldNames   // 输出key时是否使用双引号,默认为true 
WriteMapNullValue     //是否输出值为null的字段,默认为false 
WriteNullNumberAsZero    //数值字段如果为null,输出为0,而非null 
WriteNullListAsEmpty   //List字段如果为null,输出为[],而非null 
WriteNullStringAsEmpty   //字符类型字段如果为null,输出为”“,而非null 
WriteNullBooleanAsFalse   //Boolean字段如果为null,输出为false,而非null

hi,我所遇到的问题是反序列化。json串转对象的时候,json串里面的null转成对象的可以转成空字符串("")。或者也可以提前操作,标准化json格式,将json串里面的null,转成""。String str = JSON.toJSONString(obj, SerializerFeature.WriteNullStringAsEmpty); obj传string进行格式化得到的str并不能再反序列化。异常java.lang.reflect.InvocationTargetException

3

@Hireek 从异常上看是反射的一个BUG,如果你有完整的test 示例你可以发出来, 另外你可以自定义一个ValueFilter尝试一下。

    private ValueFilter filter = new ValueFilter(){
        @Override
        public Object process(Object obj, String s, Object v){
            if(v == null){
                 return "";
            }
            return v;
        }
    };

然后在 toJSONString add filter

String str = JSON.toJSONString(obj, filter, SerializerFeature.WriteNullStringAsEmpty);
5
@Data
public class FastjsonTestDto {
    private List<TestData> data;
}
@Data
public class TestData {
    private String id;

    private String title;
}
/**
 * TestDemo
 *
 * @author Hireek
 * @date 2021-11-12 16:27
 */
public class FastJsonTest {
    @Test
    public void testFastJsonBug() {
        String rep = "{\"data\":[{\"id\":\"fe7cb187-2402-4a92-96b2-152e7b57b3f6\",\"title\":null}]}";
        FastjsonTestDto testDto = JSON.parseObject(rep, new TypeReference<>() {
        });
        System.out.println(testDto.toString());
    }
}

@Jzow 测试用例如上,我想反序列化的时候null为“”。 String str = JSON.toJSONString(obj, filter, SerializerFeature.WriteNullStringAsEmpty);这个对字符串再处理并不能解决。

4

@Hireek 请问你找到办法了吗?

9

not yet