[alibaba/fastjson]字段位置被交换

2025-11-11 387 views
1

String json = "{\"apiName\":\"template.loadAll\",\"param\":{\"name\":\"张三\",\"age\":\"12\"},\"callbacks\":\"\"}";

public class InjectedBean { private String apiName; private String param; private String callbacks;

public String getApiName() {
    return apiName;
}

public void setApiName(String apiName) {
    this.apiName = apiName;
}

public String getParam() {
    return param;
}

public void setParam(String param) {
    this.param = param;
}

public String getCallbacks() {
    return callbacks;
}

public void setCallbacks(String callbacks) {
    this.callbacks = callbacks;
}

}

InjectedBean parseObject = JSON.parseObject(json,InjectedBean.class); System.out.println(parseObject.getParam());

输出结果{"age":"12","name":"张三"} 我原本是{"name":"张三","age":"12"} 版本compile 'com.alibaba:fastjson:1.1.58.android'

回答

0

可以试下 InjectedBean parseObject = JSON.parseObject(json,InjectedBean.class,Feature.OrderedField);

7

依然被交换了 , 使用非Android版就不会有问题

1

看了下Android版本的源码,问题出在

com.alibaba.fastjson.serializer.MapSerializer

Map<?, ?> map = (Map<?, ?>) object;
        Class<?> mapClass = map.getClass();
        boolean containsKey = (mapClass == JSONObject.class || mapClass == HashMap.class || mapClass == LinkedHashMap.class) 
                && map.containsKey(JSON.DEFAULT_TYPE_KEY);

        if ((out.features & SerializerFeature.SortField.mask) != 0) {
            if ((!(map instanceof SortedMap)) && !(map instanceof LinkedHashMap)) {
                try {
                    map = new TreeMap(map);
                } catch (Exception ex) {
                    // skip
                }
            }
        }

传入的object为JSONObject对象里边虽然存的linkedHashMap但是对象本身 if ((!(map instanceof SortedMap)) && !(map instanceof LinkedHashMap)) { 判断为true,所以就把map的顺序搞乱了,不知道是不是bug,在普通版本中这块被注释掉了。

3

知道问题源了 , 期望确定一下是不是BUG

4

是这样设计的,不是bug

5

有可能提供一种配置让位置不要交换呢