fastjson解析字符串,字段按字符串中顺序排列

fastjson在把字符串解析成Json对象时,可以通过指定Feature.OrderedField来使Json对象中的元素按字符串中的顺序排列。

但在把字符串解析成JsonArray时好像没有这样的参数可以设置。

在查看源码后发现JSONArray.parseArray内部调用了new JSONObject(lexer.isEnabled(Feature.OrderedField))

1
2
3
4
5
6
7
public final boolean isEnabled(Feature feature) {
        return isEnabled(feature.mask);
    }
 
    public final boolean isEnabled(int feature) {
        return (this.features & feature) != 0;
    }

这里的this.features实际就是JSON.DEFAULT_PARSER_FEATURE

 

废话少说,上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static void main(String[] args) {
        String str = "{\"b\":321,\"a\":123}";
        JSONObject json = JSONObject.parseObject(str);
        System.out.println(json);//结果为:{"a":123,"b":321}
         
        JSONObject json2 = JSONObject.parseObject(str, Feature.OrderedField);
        System.out.println(json2);//结果为:{"b":321,"a":123}
         
        String arrStr = "[{\"b\":321,\"a\":123}]";
        JSONArray array = JSONArray.parseArray(arrStr);
        System.out.println(array);//结果为:[{"a":123,"b":321}]
         
        int temp = JSON.DEFAULT_PARSER_FEATURE;
        JSON.DEFAULT_PARSER_FEATURE = Feature.config(JSON.DEFAULT_PARSER_FEATURE, Feature.OrderedField, true);
        JSONArray array2 = JSONArray.parseArray(arrStr);
        JSON.DEFAULT_PARSER_FEATURE = temp;
        System.out.println(array2);//结果为:[{"b":321,"a":123}]
    }

说明:

如果没有设置Feature.OrderedField则json对象中的元素按字典顺序排列,

如果设置了Feature.OrderedField则按字符串中的顺序排列。

JSON.DEFAULT_PARSER_FEATURE是全局的,如果不希望影响其他功能,建议在完成字符串解析后再把JSON.DEFAULT_PARSER_FEATURE设置为默认值。

 

这应该只是一种解决方式,如果你有其他的方式,欢迎留言。

如果文章有什么不正确的地方,欢迎指出,我会第一时间改正。

 

posted @ 2019-03-30 14:11  Null-Point  阅读(6275)  评论(0)    收藏  举报
编辑推荐:
· 运维排查 | SaltStack 远程命令执行中文乱码问题
· Java线程池详解:高效并发编程的核心利器
· 从“看懂世界”到“改造世界”:AI发展的四个阶段你了解了吗?
· 协程本质是函数加状态机——零基础深入浅出 C++20 协程
· 编码之道,道心破碎。
阅读排行:
· 基于.net6的一款开源的低代码、权限、工作流、动态接口平台
· 一个自认为理想主义者的程序员,写了5年公众号、博客的初衷
· Claude Code 初体验 - Windows
· 基于 C# 编写的轻量级工控网关和 SCADA 组态软件
· .NET 8 gRPC 实现高效100G大文件断点续传工具
点击右上角即可分享
微信分享提示