[alibaba/fastjson]无法把JavaBean里面long类型(主类型)的属性转换为String?

2024-05-22 47 views
9

fastjson版本 1.2.58 和 1.2.71都试了。

一个JavaBean里面的long类型属性,用下面代码无法转成String。 注意:是主类型 long,不是Long对象类型 ` MyBean bean = new MyBean(); bean.card_id = 1234567890123456L;

SerializeConfig serializeConfig = SerializeConfig.globalInstance; serializeConfig.put(Long.class, ToStringSerializer.instance); serializeConfig.put(Long.TYPE, ToStringSerializer.instance);

JSON.toJSONString(bean, serializeConfig); ` 以上代码,无法把card_id转成String

回答

6

不能使用 'SerializerFeature.WriteNonStringValueAsString' ,也不能用 'SerializerFeature.BrowserCompatible'。因为我只想把 long 转成 string。是主类型 long(小写的long)。我需要在转换的时候增加一些处理,比如只对 (10000, 38000000)之间的long,做转换。

5

不能使用 'SerializerFeature.WriteNonStringValueAsString' ,也不能用 'SerializerFeature.BrowserCompatible'。因为我只想把 long 转成 string。是主类型 long(小写的long)。我需要在转换的时候增加一些处理,比如只对 (10000, 38000000)之间的long,做转换。

8

@patrickj-fd 可以覆盖默认的 Codec. 我还试验了 SerializeFilter 会报错.

public class CustomLongCodecTest extends TestCase {
    @Test
    void test() {
        ObjectSerializer storedLongSerializer = SerializeConfig.getGlobalInstance().get(Long.class);
        try {
            SerializeConfig.getGlobalInstance().put(Long.class, CustomLongCodec.instance);

            assertEquals("{\"val\":9999}", JSON.toJSONString(new VO(9999)));
            assertEquals("{\"val\":\"10000\"}", JSON.toJSONString(new VO(10000)));
            assertEquals("{\"val\":\"3800000\"}", JSON.toJSONString(new VO(3800000)));
            assertEquals("{\"val\":38000001}", JSON.toJSONString(new VO(38000001)));
        } finally {
            SerializeConfig.getGlobalInstance().put(Long.class, storedLongSerializer);
        }
    }

    private static final class CustomLongCodec extends LongCodec {
        public static final CustomLongCodec instance = new CustomLongCodec();

        @Override
        public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
            SerializeWriter out = serializer.out;

            if (object == null) {
                out.writeNull(SerializerFeature.WriteNullNumberAsZero);
            } else {
                long value = (Long) object;
                if (value >= 10000 && value <= 3800000) {
                    out.writeString(String.valueOf(value));
                } else {
                    out.writeLong(value);
                }

                if (out.isEnabled(SerializerFeature.WriteClassName) //
                        && value <= Integer.MAX_VALUE && value >= Integer.MIN_VALUE //
                        && fieldType != Long.class
                        && fieldType != long.class) {
                    out.write('L');
                }
            }
        }
    }

    private static final class VO {
        private long val;

        public VO(long val) {
            this.val = val;
        }

        public long getVal() {
            return this.val;
        }

        public void setVal(long val) {
            this.val = val;
        }
    }
}