sunny123456

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

json解析之fastjson和jackson使用对比

前言

最近项目中需要做埋点分析,首先就需要对埋点日志进行解析处理,刚好这时候体验对比了下fastjsonjackson两者使用的区别,以下分别是针对同一个json串处理,最终的效果都是将json数据解析出来,并统一展示。


一、fastjson简介?

fastjson是由国内的阿里推出的一种json处理器,由java语言编写,无依赖,不需要引用额外的jar包,能直接运行在jdk环境中,它的解析速度是非常之快的,目前超过了所有json库
提示:以下是引用fastjson的方法,数据未涉及到私密信息

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.flink.shaded.jackson2.com.fasterxml.jackson.core.JsonProcessingException;
public class FastJsonTest {
    public static void main(String[] args) throws JsonProcessingException {
        String json = "{\n" +
                "    \"distinct_id\": \"77\",\n" +
                "    \"identities\":\n" +
                "    {\n" +
                "        \"$identity_mp_id\": \"37\",\n" +
                "        \"$identity_login_id\": \"77\",\n" +
                "        \"$identity_mp_wx17a032a586c19379_openid\": \"oiF\",\n" +
                "        \"$identity_anonymous_id\": \"oiF\"\n" +
                "    },\n" +
                "    \"lib\":\n" +
                "    {\n" +
                "        \"$lib\": \"MiniProgram\",\n" +
                "        \"$lib_method\": \"code\",\n" +
                "        \"$lib_version\": \"1.17.7\"\n" +
                "    },\n" +
                "    \"properties\":\n" +
                "    {\n" +
                "        \"$lib\": \"MiniProgram\",\n" +
                "        \"$lib_version\": \"1.17.7\",\n" +
                "        \"$network_type\": \"WIFI\",\n" +
                "        \"$brand\": \"IPHONE\",\n" +
                "        \"$manufacturer\": \"iPhone\",\n" +
                "        \"$model\": \"iPhone 12 Pro Max<iPhone13,4>\",\n" +
                "        \"$screen_width\": 428,\n" +
                "        \"$screen_height\": 926,\n" +
                "        \"$os\": \"iOS\",\n" +
                "        \"$os_version\": \"14.2.1\",\n" +
                "        \"$mp_client_app_version\": \"8.0.44\",\n" +
                "        \"$mp_client_basic_library_version\": \"3.2.5\",\n" +
                "        \"$timezone_offset\": -480,\n" +
                "        \"$app_id\": \"wx17a039\",\n" +
                "        \"$app_version\": \"1.3\",\n" +
                "        \"platform_type\": \"小程序\",\n" +
                "        \"product_name\": \"小程序\",\n" +
                "        \"member_flag\": false,\n" +
                "        \"member_level\": \"非会员\",\n" +
                "        \"$latest_scene\": \"wx-10\",\n" +
                "        \"$scene\": \"wx-10\",\n" +
                "        \"$url_path\": \"pages/Common/Url/index\",\n" +
                "        \"$title\": \"照明\",\n" +
                "        \"$url_query\": \"\",\n" +
                "        \"$referrer\": \"pages/Common/Url/index\",\n" +
                "        \"$referrer_title\": \"照明\",\n" +
                "        \"$url\": \"pages/Common/Url/index\",\n" +
                "        \"$is_first_day\": false,\n" +
                "        \"$ip\": \"11.11.11.11\",\n" +
                "        \"$browser\": \"WeChat\",\n" +
                "        \"$browser_version\": \"8\",\n" +
                "        \"$track_signup_original_id\": \"oiF\",\n" +
                "        \"$is_login_id\": true,\n" +
                "        \"$ad_extra_properties\": \"{\\\"sdf_channel_closed\\\":false}\",\n" +
                "        \"$city\": \"上海\",\n" +
                "        \"$province\": \"上海\",\n" +
                "        \"$country\": \"中国\"\n" +
                "    },\n" +
                "    \"login_id\": \"77\",\n" +
                "    \"anonymous_id\": \"oiF\",\n" +
                "    \"type\": \"track\",\n" +
                "    \"event\": \"$MPShow\",\n" +
                "    \"_track_id\": 5692,\n" +
                "    \"time\": 1703,\n" +
                "    \"_flush_time\": 17032,\n" +
                "    \"device_id\": \"oiFOU\",\n" +
                "    \"project_id\": 2,\n" +
                "    \"map_id\": \"oiFOU\",\n" +
                "    \"user_id\": -4011,\n" +
                "    \"recv_time\": 1703,\n" +
                "    \"extractor\":\n" +
                "    {\n" +
                "        \"f\": \"sdf_input_topic\",\n" +
                "        \"o\": 379,\n" +
                "        \"n\": \"sdf_input_topic\",\n" +
                "        \"s\": 379,\n" +
                "        \"c\": 379,\n" +
                "        \"p\": 1,\n" +
                "        \"e\": \"hyb\"\n" +
                "    },\n" +
                "    \"edge_progress\":\n" +
                "    {\n" +
                "        \"f\": \"(dev=821,ino=537178209)\",\n" +
                "        \"n\": \"access_log.2023122213\",\n" +
                "        \"o\": 1400687,\n" +
                "        \"s\": 37229603,\n" +
                "        \"c\": 37229604,\n" +
                "        \"e\": \"hybr\"\n" +
                "    },\n" +
                "    \"project\": \"test\",\n" +
                "    \"ver\": 2\n" +
                "}";
        JSONObject jsonObject = JSON.parseObject(json);
        new FastJsonTest().travelJSONObject(jsonObject);
    }
    public void travelJSONObject(JSONObject originalJSONObject) {
        for (String key : originalJSONObject.keySet()) {    
            StringBuilder path = new StringBuilder(key);
            Object value = originalJSONObject.get(key);
            if (value instanceof String || value instanceof Number || value instanceof Boolean) {
                System.out.println(key + " : " + value);
                continue;
            }
            if (value instanceof JSONObject) {
                JSONObject object = (JSONObject) value;
                travelJSONObject(object);
            }
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117

二、jackson简介

jackson是用来序列化和反序列化json的java开源框架,社区相对比较活跃,更新速度较快,是最流行的json解析器之一,也是Spring MVC默认json解析器。
提示:以下是引用jackson的方法,数据未涉及到私密信息

import org.apache.flink.shaded.jackson2.com.fasterxml.jackson.core.JsonProcessingException;
import org.apache.flink.shaded.jackson2.com.fasterxml.jackson.databind.JsonNode;
import org.apache.flink.shaded.jackson2.com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Iterator;
public class JacksonTest {
    public static void main(String[] args) throws JsonProcessingException {
        String json = "{\n" +
                "    \"distinct_id\": \"77\",\n" +
                "    \"identities\":\n" +
                "    {\n" +
                "        \"$identity_mp_id\": \"37\",\n" +
                "        \"$identity_login_id\": \"77\",\n" +
                "        \"$identity_mp_wx17a032a586c19379_openid\": \"oiF\",\n" +
                "        \"$identity_anonymous_id\": \"oiF\"\n" +
                "    },\n" +
                "    \"lib\":\n" +
                "    {\n" +
                "        \"$lib\": \"MiniProgram\",\n" +
                "        \"$lib_method\": \"code\",\n" +
                "        \"$lib_version\": \"1.17.7\"\n" +
                "    },\n" +
                "    \"properties\":\n" +
                "    {\n" +
                "        \"$lib\": \"MiniProgram\",\n" +
                "        \"$lib_version\": \"1.17.7\",\n" +
                "        \"$network_type\": \"WIFI\",\n" +
                "        \"$brand\": \"IPHONE\",\n" +
                "        \"$manufacturer\": \"iPhone\",\n" +
                "        \"$model\": \"iPhone 12 Pro Max<iPhone13,4>\",\n" +
                "        \"$screen_width\": 428,\n" +
                "        \"$screen_height\": 926,\n" +
                "        \"$os\": \"iOS\",\n" +
                "        \"$os_version\": \"14.2.1\",\n" +
                "        \"$mp_client_app_version\": \"8.0.44\",\n" +
                "        \"$mp_client_basic_library_version\": \"3.2.5\",\n" +
                "        \"$timezone_offset\": -480,\n" +
                "        \"$app_id\": \"wx17a039\",\n" +
                "        \"$app_version\": \"1.3\",\n" +
                "        \"platform_type\": \"小程序\",\n" +
                "        \"product_name\": \"小程序\",\n" +
                "        \"member_flag\": false,\n" +
                "        \"member_level\": \"非会员\",\n" +
                "        \"$latest_scene\": \"wx-10\",\n" +
                "        \"$scene\": \"wx-10\",\n" +
                "        \"$url_path\": \"pages/Common/Url/index\",\n" +
                "        \"$title\": \"照明\",\n" +
                "        \"$url_query\": \"\",\n" +
                "        \"$referrer\": \"pages/Common/Url/index\",\n" +
                "        \"$referrer_title\": \"照明\",\n" +
                "        \"$url\": \"pages/Common/Url/index\",\n" +
                "        \"$is_first_day\": false,\n" +
                "        \"$ip\": \"11.11.11.11\",\n" +
                "        \"$browser\": \"WeChat\",\n" +
                "        \"$browser_version\": \"8\",\n" +
                "        \"$track_signup_original_id\": \"oiF\",\n" +
                "        \"$is_login_id\": true,\n" +
                "        \"$ad_extra_properties\": \"{\\\"sdf_channel_closed\\\":false}\",\n" +
                "        \"$city\": \"上海\",\n" +
                "        \"$province\": \"上海\",\n" +
                "        \"$country\": \"中国\"\n" +
                "    },\n" +
                "    \"login_id\": \"77\",\n" +
                "    \"anonymous_id\": \"oiF\",\n" +
                "    \"type\": \"track\",\n" +
                "    \"event\": \"$MPShow\",\n" +
                "    \"_track_id\": 5692,\n" +
                "    \"time\": 1703,\n" +
                "    \"_flush_time\": 17032,\n" +
                "    \"device_id\": \"oiFOU\",\n" +
                "    \"project_id\": 2,\n" +
                "    \"map_id\": \"oiFOU\",\n" +
                "    \"user_id\": -4011,\n" +
                "    \"recv_time\": 1703,\n" +
                "    \"extractor\":\n" +
                "    {\n" +
                "        \"f\": \"sdf_input_topic\",\n" +
                "        \"o\": 379,\n" +
                "        \"n\": \"sdf_input_topic\",\n" +
                "        \"s\": 379,\n" +
                "        \"c\": 379,\n" +
                "        \"p\": 1,\n" +
                "        \"e\": \"hyb\"\n" +
                "    },\n" +
                "    \"edge_progress\":\n" +
                "    {\n" +
                "        \"f\": \"(dev=821,ino=537178209)\",\n" +
                "        \"n\": \"access_log.2023122213\",\n" +
                "        \"o\": 1400687,\n" +
                "        \"s\": 37229603,\n" +
                "        \"c\": 37229604,\n" +
                "        \"e\": \"hybr\"\n" +
                "    },\n" +
                "    \"project\": \"test\",\n" +
                "    \"ver\": 2\n" +
                "}";
        ObjectMapper mapper = new ObjectMapper();
        JsonNode jsonNode = mapper.readTree(json);
        Iterator<String> keys = jsonNode.fieldNames();
        while (keys.hasNext()){
            String key = keys.next();
            JsonNode value = jsonNode.get(key);
            if(value instanceof JsonNode){
                Iterator<String> subkeys = value.fieldNames();
                while (subkeys.hasNext()){
                    String subkey = subkeys.next();
                    JsonNode subvalue = value.get(subkey);
                    System.out.println(subkey + " : " + subvalue);
                }
            }else{
                System.out.println(key + ":"+ "\t" + jsonNode.get(key)) ;
            }
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119

总结

分别对两个json解析器进行试用,个人感觉jackson代码比较优雅,类似java jdbc连接数据的使用规范,估计这也是国外特别喜欢用它的原因吧,而fastjson的感觉就是速度特别快,用起来也比较简单,注重实用性,当然了,上面只是一个简单的解析代码,并没有涉及到复杂的操作,由于时间关系,只是简单介绍下两者的使用方法,关于两者的使用,后续会结合项目中的场景持续更新。

原文链接:https://blog.csdn.net/weixin_43153588/article/details/135162181
posted on 2024-11-19 16:57  sunny123456  阅读(6)  评论(0编辑  收藏  举报