fastjson排序 Map多层嵌套转换自动排序问题终极解决方案

本文介绍如何解决使用FastJSON将多层嵌套JSON转换为有序Map时出现的排序错误问题。通过调整解析配置,成功保持了JSON对象内部字段的原始顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       最近项目中用到了fastjson(1.2.15)需要将前端多层嵌套json转换为map,由于map的无序性,想了很多办法,最终找到使用 Map m= JSONArray.parseObject(json, LinkedHashMap<String,String>.class); 来转换,问题来了,第一层顺序是对的,但是第二层排序居然出问题了,目前仅仅只是需要转换成String 他居然把String都给自动排序了,后来网上查了很多资料发现还可以采用一种方式:

    JSONObject jsonObj = new JSONObject(true);
    Map m= jsonObj.parseObject(json, LinkedHashMap.class);

 但是输出问题还是存在第二层以后排序混乱,如下:

传入Json:
{"t1":"","t3":"","t2":{"a1":"","a3":"","a2":""}}

 

输出:

{t1=, t3=, t2={"a1":"","a2":"","a3":""}}

 

无奈,跟踪fastjson源码,花了2小时在com.alibaba.fastjson.parser.DefaultJSONParser 类中475行发现

 else if (ch == '{') { // 减少嵌套,兼容android
                    lexer.nextToken();

                    final boolean parentIsArray = fieldName != null && fieldName.getClass() == Integer.class;

                    JSONObject input = new JSONObject(lexer.isEnabled(Feature.OrderedField));
                   

 居然这里面判断了Feature.OrderedField

果断知道了解决办法:

HashMap m=  JSON.parseObject(json,LinkedHashMap.class,Feature.OrderedField);

搞定,输出结果:

{t1=, t3=, t2={"a1":"","a3":"","a2":""}}

 

功夫不负有心人.........

<think>好的,我现在需要解释一下用户提到的fastjsonMap的序列化风格为“/a/b/c=d”的问题。首先,我得回想一下fastjson的基本用法和配置选项。用户提到的这种路径风格,可能涉及到特定的序列化器配置,比如使用斜杠分隔的键路径来表示嵌套结构。 接下来,我需要确认fastjson是否支持这种风格的Map序列化。记得fastjson默认情况下会将Map序列化为JSON对象,键是字符串,值可以是任意类型。但用户提到的例子看起来像是将嵌套的键用斜杠连接起来,形成类似路径的结构,而值则是等号后面的部分。这可能是一个自定义的序列化方式,或者是通过某种特殊配置实现的。 然后,我应该考虑是否有相关的配置选项或注解可以实现这种效果。例如,fastjson的SerializerFeature中有各种序列化特性,但不确定是否有直接支持这种风格的。可能需要自定义一个序列化器,或者在序列化过程中对键进行处理,将嵌套的键转换为路径格式。 另外,用户的问题可能涉及到将多层嵌套Map结构扁平化,用路径作为键。例如,一个Map中包含嵌套Map,键"a"对应另一个Map,其键"b"对应另一个Map,键"c"对应的值是"d"。这时候序列化时,可能需要遍历所有嵌套的键,生成类似"/a/b/c"这样的键,并将值设为"d"。 接下来,我需要思考如何用代码实现这一点。可能需要自定义一个ObjectSerializer,递归地处理Map中的每个条目,构建键的路径,并将最终的键值对放入结果中。例如,遍历原始Map的每个entry,如果值本身也是一个Map,则递归处理,并将当前键添加到路径中,直到遇到非Map类型的值,然后将完整的路径和值作为键值对输出。 同时,需要注意处理可能的循环引用和不同类型的值,确保序列化过程不会进入无限递归或抛出异常。此外,还需要考虑性能问题,特别是在处理深层嵌套或大型Map时,自定义序列化器的效率如何。 还需要验证一下,用户提到的这种风格是否真的是fastjson的内置功能,还是需要自己实现。查阅fastjson的文档或社区讨论可能会有帮助。如果发现没有内置支持,那么回答的重点应该放在如何通过自定义序列化器来实现这种效果,并提供示例代码。 最后,整理思路,分步骤解释:首先说明fastjson默认的Map序列化方式,然后指出用户的需求与默认的不同,接着介绍如何通过自定义序列化器或配置实现路径风格的键,最后给出具体的代码示例和注意事项,确保用户能够理解并实现这一功能。</think>关于fastjsonMap序列化为`/a/b/c=d`这种路径风格的问题,这里分步骤解释: 1. **默认行为** fastjson默认将Map序列化为标准JSON对象结构。例如: ```java Map<String, Object> map = new HashMap<>(); map.put("a", Collections.singletonMap("b", Collections.singletonMap("c", "d"))); String json = JSON.toJSONString(map); ``` 输出结果为嵌套结构: `{"a":{"b":{"c":"d"}}}` 2. **路径风格的需求** 若需要将嵌套Map转换为`/a/b/c=d`的扁平化路径格式,需自定义序列化逻辑。这种风格常见于配置系统或URL参数传递。 3. **实现方案** **方案一:自定义序列化器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值