使用 fastjson 解析json中的键值:乱序和原样输出

栏目: Java · 发布时间: 5年前

内容简介:最近项目需要做一个java版本的demo,简单来做就是按照api文档拼装请求报文请求自己的服务端,收到应答报文后做MD5签名验证等后续处理。由于客户端和服务端之前通讯报文是json格式的,那么就会涉及到json报文的生成和解析。网上找了下,貌似阿里巴巴的那问题就出在这个原始的待签报文为什么会被改变的环节了:用

最近项目需要做一个 java 版本的demo,简单来做就是按照api文档拼装请求报文请求自己的服务端,收到应答报文后做MD5签名验证等后续处理。由于客户端和服务端之前通讯报文是json格式的,那么就会涉及到json报文的生成和解析。网上找了下,貌似阿里巴巴的 fastjson 库评价不错,所以就直接拿过来用了。

1 与实际的偏差

fastjson 封装的api函数倒是蛮简单的,直接拿过来就可以上手用了。但是demo程序在对服务端返回的报文做验签的时候总是通不过,后面把原始的待签报文和服务器的待签报文一对比发现两者不一致,这样验签肯定是失败的。

那问题就出在这个原始的待签报文为什么会被改变的环节了:用 fastjson 从json格式的应答报文中获取的这个待签报文被重新 排序 了(见小节2中的 json_order_is_changed 函数)。

在查过资料后,原来是 fastjson 包中的 JSONObject 对象中,如果直接使用 parseObject 方法,可能会导致json数据重新排序。这个问题可以通过使用 com.alibaba.fastjson.parser.Feature 包解决,但是需要使用最新的 fastjson 包。

2 示例程序

由于demo中的业务代码过长,这里把关键的json报文解析的这一部分抽出来做了个演示程序。

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.parser.Feature;
import java.util.LinkedHashMap;


/**
* File:   fastjsonParseMain.java
* Description:   使用 fastjson 解析json中的键值:乱序和原样输出
* Refer:         最新的fastjson包可以到官网 https://github.com/alibaba/fastjson/releases 去下载。
* (c) 2019.01.22 vfhky https://typecodes.com/java/fastjsonorder1.html
*/
public class fastjsonParseMain {
    public fastjsonParseMain(){

    }

    /**
    * 使用 fastjson 根据输入的key原样获取json中对应的值。
    *
    * @param    s_json_data     json字符串
    * @param    s_key           json字符串中的key
    * @return   value           key对应的value
    */
    public static String json_order_not_change(String s_json_data, String s_key) {
        // 1.2.54版本的fastjson包测试通过
        LinkedHashMap<String, Object> json = JSON.parseObject(s_json_data, LinkedHashMap.class, Feature.OrderedField);
        JSONObject jsonObject=new JSONObject(true);
        jsonObject.putAll(json);
        if( null == json.get(s_key) ) {
            return "";
        } else {
            return json.get(s_key).toString();
        }
    }

    /**
    * 使用 fastjson 根据输入的key获取json中对应的值(可能会被排序)。
    *
    * @param    s_json_data     json字符串
    * @param    s_key           json字符串中的key
    * @return   value           key对应的value
    */
    public static String json_order_is_changed(String s_json_data, String s_key){
        JSONObject object=JSONObject.parseObject(s_json_data);
        if( null == object.getString(s_key) ) {
            return "";
        } else {
            return object.getString(s_key).toString();
        }
    }


    public static void main(String[] args){
        String s_org_buff = "{\"cmd_1\":1, \"cmd_2\":2, \"biz_content\":{\"aa\":\"11\",\"cb\":\"55\",\"11\":\"66\"}}";
        String s_dst_buff = "";

        System.out.println("==================== 原始json字符串 ===================");
        System.out.println("s_org_buff=[" + s_org_buff + "].\n");

        System.out.println("==================== 获取的value可能是乱序的 ===================");
        s_dst_buff = fastjsonParseMain.json_order_is_changed( s_org_buff, "biz_content" );
        System.out.println("s_dst_buff=[" + s_dst_buff + "].\n");

        System.out.println("==================== 原样输出对应的 value 值 ====================");
        s_dst_buff = fastjsonParseMain.json_order_not_change( s_org_buff, "biz_content" );
        System.out.println("s_dst_buff=[" + s_dst_buff + "].\n");
    }
}

3 执行效果

上面代码 json_order_not_change 函数通过 Feature 参数使得解析json数据的时候能够保持原样,而 json_order_is_changed 函数中获取的value值可能会是排序后的数据。

两者的效果如下图所示:

使用 fastjson 解析json中的键值:乱序和原样输出


以上所述就是小编给大家介绍的《使用 fastjson 解析json中的键值:乱序和原样输出》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

程序员之禅

程序员之禅

[德] Christian Grobmeier / 荣耀、朱艳 / 人民邮电出版社 / 2015-8 / 39.00元

禅是一种生活态度和生活方式。程序员是一份特别辛苦的职业,也是一个承受各种压力的群体。在物欲横流的今天,禅对于程序员有着特殊的意义和价值。 本书的作者是一名德国程序员老兵,深谙程序员的喜怒哀乐。他曾经发表了一篇题为“程序员之禅的十条法则”的博客文章,引发众多程序员热烈的讨论和强烈的共鸣。本书共10章,结合程序员日常生活和工作的方方面面,作者通过对禅的知识、理解、体验、思考和感悟,提出很多中肯的......一起来看看 《程序员之禅》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具