最近项目中需要做埋点分析,首先就需要对埋点日志进行解析处理,刚好这时候体验对比了下fastjson和jackson两者使用的区别,以下分别是针对同一个json串处理,最终的效果都是将json数据解析出来,并统一展示。
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);
}
}
}
}
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)) ;
}
}
}
}
分别对两个json解析器进行试用,个人感觉jackson代码比较优雅,类似java jdbc连接数据的使用规范,估计这也是国外特别喜欢用它的原因吧,而fastjson的感觉就是速度特别快,用起来也比较简单,注重实用性,当然了,上面只是一个简单的解析代码,并没有涉及到复杂的操作,由于时间关系,只是简单介绍下两者的使用方法,关于两者的使用,后续会结合项目中的场景持续更新。