alibaba / fastjson

FASTJSON 2.0.x has been released, faster and more secure, recommend you upgrade.
https://github.com/alibaba/fastjson2/wiki/fastjson_1_upgrade_cn
Apache License 2.0
25.72k stars 6.5k forks source link

JSON.toJSONString序列化后,fieldName的顺序问题 #1859

Open HalfWater opened 6 years ago

HalfWater commented 6 years ago

Fastjson中通过@JSONType,@JSONField注解可以定义属性的顺序 如: @JSONType(orders={"name","age","gender","height","weight"}) public class Person { private String name; private Integer age; private String gender; private Double height; private Double weight; }

或者: public class Person { @JSONField(ordinal = 1) private String name; @JSONField(ordinal = 2) private Integer age; @JSONField(ordinal = 3) private String gender; @JSONField(ordinal = 4) private Double height; @JSONField(ordinal = 5) private Double weight; }

如果每个VO都显示的指定顺序会比较繁琐。所以,我的问题是: 1、fastjson设计为按顺序输出的目的是什么?

2、有没有全局的配置,来取消属性排序的功能?

3、是否会推出指定的SerializerFeature? 现有的SerializerFeature.SortField,SerializerFeature.MapSortField都是针对JSONField的。

lousama commented 6 years ago

按顺序输出业务场景会需要到,比如是为了生成一些报表而传递或保存的数据,那么要保证格式和列的顺序与业务需求一致

HalfWater commented 6 years ago

@lousama 正是因为这个原因,我找了一圈并没有找到一个比较直接的配置,实现生成的json顺序和定义的pojo中的field的顺序一致的,不许要定义排序规则,也不需要按名称排序的。

aqqwiyth commented 6 years ago

之前遇到过一个问题. fastjson版本不同 对一个JSONObject.toJSONString(hashmap)的顺序也不一样

mofee commented 6 years ago

我是这样设置的: JSON.DEFAULT_GENERATE_FEATURE = JSON.DEFAULT_GENERATE_FEATURE & ~SerializerFeature.SortField.getMask(); 但是也没有生效,所以正要来提问题

calvinit commented 5 years ago

同样有这个问题,不知道fastjson作者怎么想的,我明明不想让它自动排序,它却自动按字典顺序排序,又找不到修改这个配置的入口。

xbeginagain commented 5 years ago

都2019了,这个问题有解决嘛,同样是不想排序。。使用的版本是1.2.58

gfkobe commented 4 years ago

同求默认按field顺序排序

hopana commented 4 years ago

强烈要求自己定义JSON.toJSONString()是否排序!!!真是后悔用fastjson了,不知道作者怎么想的???

riverluoo commented 4 years ago

真的需要一个自定义JSON.toJSONString()是否排序

joyang1 commented 4 years ago

👍 ,为什么不实现一个按定义的 FieldName 的顺序排序?使用 JSONType 和 JSONField 是否比较繁琐?

xuqiming commented 4 years ago

把默认的SortField剔除可解决这个问题 JSON.DEFAULT_GENERATE_FEATURE = JSON.DEFAULT_GENERATE_FEATURE &~ SerializerFeature.SortField.getMask();

wilder-ness commented 4 years ago

把默认的SortField剔除可解决这个问题 JSON.DEFAULT_GENERATE_FEATURE = JSON.DEFAULT_GENERATE_FEATURE &~ SerializerFeature.SortField.getMask();

来个例子。。。 我2个系统传值 用同一个方法 JSON.toJSONString(reqData,JSON.DEFAULT_GENERATE_FEATURE &~ SerializerFeature.SortField.getMask(), SerializerFeature.MapSortField); 转出来的值顺序正好相反。。

我想两个地方转出来的顺序要一样的。。求解怎么实现

xuqiming commented 4 years ago

把默认的SortField剔除可解决这个问题 JSON.DEFAULT_GENERATE_FEATURE = JSON.DEFAULT_GENERATE_FEATURE &~ SerializerFeature.SortField.getMask();

来个例子。。。 我2个系统传值 用同一个方法 JSON.toJSONString(reqData,JSON.DEFAULT_GENERATE_FEATURE &~ SerializerFeature.SortField.getMask(), SerializerFeature.MapSortField); 转出来的值顺序正好相反。。

我想两个地方转出来的顺序要一样的。。求解怎么实现

抱歉现在才看到,可以参考这里https://github.com/alibaba/fastjson/issues/3115

wyyl1 commented 3 years ago

按顺序输出业务场景会需要到,比如是为了生成一些报表而传递或保存的数据,那么要保证格式和列的顺序与业务需求一致

你的头像很有意思