[alibaba/fastjson]为什么 map的value是byte[],并且我在ParserConfig注册了byte[]的反序列化器,但是却没有调用到?

2024-05-22 630 views
1

json string -> java byte[] 仅支持内置的base64?

package com.l1yp;

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.parser.ParserConfig;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.l1yp.util.JsonTool;
import com.qq.protocol.pb.ByteArrayDeserializer;
import com.qq.protocol.pb.serializer.ByteArraySerializer;

import java.util.Arrays;
import java.util.Map;

/**
 * @Author Lyp
 * @Date 2020/7/11
 * @Email l1yp@qq.com
 */
public class FastjsonTest {

    private static class User {
        public Map<String, byte[]> key;
    }

    public static void main(String[] args) {
        ParserConfig.getGlobalInstance().putDeserializer(byte[].class, new ByteArrayDeserializer());
        String json = """
                {"key": {"data":"01020304"}}
                """;
        User user1 = JSONObject.parseObject(json, User.class);
        System.out.println("user1 = " + user1);
    }

}

public class ByteArrayDeserializer implements ObjectDeserializer {

    @Override
    public <T> T deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
        if (type == byte[].class){
            return (T) HexUtil.hex2bin(parser.getLexer().stringVal());
        }
        throw new UnsupportedOperationException("不支持的类型");
    }

    @Override
    public int getFastMatchToken() {
        return 0;
    }
}

回答

8

x'01020304' 可以响应 但是这都不是标准的json格式 阅读不方便 copy不方便

3

@L1yp
第一个 map 的 value 是 byte[] 这个testcase 里面是正常的,你可以再说明一下 第二个问题关联这个, #3306

7

@L1yp 第一个 map 的 value 是 byte[] 这个testcase 里面是正常的,你可以再说明一下 第二个确实还存在问题, #3306

json的string 反序列化成byte[] fastjson 在JSONScanner的bytesValue有两种判断,一种是x开头的Hex标记,另外的一种是base64字符串,这里没有给用户自定义处理的机会

5

@L1yp 第一个 map 的 value 是 byte[] 这个testcase 里面是正常的,你可以再说明一下 第二个问题关联这个, #3306

json的string 反序列化成byte[] fastjson 在JSONScanner的bytesValue有两种判断,一种是x开头的Hex标记,另外的一种是base64字符串,这里没有给用户自定义处理的机会

这个感觉需要复杂点了如果要用的话只能先自定义 Map 的反序列化了

6

不是map的问题 是byte[]的问题