一种适合懒人的JSON解析方法
来源:互联网 发布:linux进入用户命令 编辑:程序博客网 时间:2024/05/18 03:15
- 原始的JSON解析方式:
构造JSON对象 -> 判断JSON对象是否包含某个元素 -> 获取JSON对象里面的元素。
String content = "{\"name\":\"aceding\",\"age\":26}";JSONObject jsonObject = new JSONObject(content);if(jsonObject.has("name")){String name = jsonObject.getString("name");}if(jsonObject.has("age")){int age = jsonObject.getInt("age");}
元素很多的话,解析代码会写的很累。且不同内容的JSON对象要一一编写解析代码。
- 进阶的JSON解析方式:
使用第三方JSON库进行解析,如Gson、Jackson、FastJson等。
以Gson为例,简单介绍一下其解析方法:
1. 先定义JSON数据对应的Entity类。
public class User { public String name; public int age; public String emailAddress;}
2. 解析JSON数据。
Gson gson = new Gson();String jsonStr = "{\"name\":\"aceding\",\"age\":26}";User user = gson.fromJson(jsonStr, User.class);
相比于原始的解析方式,方便了些,但还需要程序员自己实现Entity类,且无法解析复杂的JSON体,如包含JSONArray和JSONObject的JSON体。
- 懒人的JSON解析方式:
1. JSON数据对应的Entity类,一行代码直接生成。
// 解析json文件,生成对应的.java文件。JsonParser.parseJsonStr(jsonStr);
jsonStr的内容:
{ "className": "Ace", "packageName": "com.ace.lazyjson.gen", "name": "ace", "age": 27, "company": { "first": "oppo", "second": "tencent" }, "hobby": [ { "young": "playgame", "little": "sleep" }, { "now": "gril" }, "fish", [ "read", { "game": "dota" }, "eat" ], [ "bike", { "work": "code" }, "sleep" ] ]}
生成的.java文件如下:
2. JSON数据的解析,一行代码直接完成解析。
//解析json内容,生成对象。Ace ace = Ace.convertFrom(jsonStr);
验证代码:
System.out.println("name: " + ace.name);System.out.println("age: " + ace.age);System.out.println("company first: " + ace.company.first);System.out.println("company second: " + ace.company.second);Object[] objs = ace.hobby;Hobby hobbyOne = (Hobby) objs[0];Hobby hobbyTwo = (Hobby) objs[1];String hobbyThree = (String) objs[2];Object[] hobbyFour = (Object[]) objs[3];Object[] hobbyFive = (Object[]) objs[4];System.out.println("hobby index 0 little/now/young: " + hobbyOne.little + " " + hobbyOne.now + " " + hobbyOne.young);System.out.println("hobby index 1 little/now/young: " + hobbyTwo.little + " " + hobbyTwo.now + " " + hobbyTwo.young);System.out.println("hobby index 2: " + hobbyThree);String hobbyFourChildOne = (String) hobbyFour[0];HobbyIndexThree hobbyFourChildTwo = (HobbyIndexThree) hobbyFour[1];String hobbyFourChildThree = (String) hobbyFour[2];System.out.println("hobby index 3 child index 0: " + hobbyFourChildOne);System.out.println("hobby index 3 child index 1 game: " + hobbyFourChildTwo.game);System.out.println("hobby index 3 child index 2: " + hobbyFourChildThree);String hobbyFiveChildOne = (String) hobbyFive[0];HobbyIndexFour hobbyFiveChildTwo = (HobbyIndexFour) hobbyFive[1];String hobbyFiveChildThree = (String) hobbyFive[2];System.out.println("hobby index 4 child index 0: " + hobbyFiveChildOne);System.out.println("hobby index 4 child index 1 work: " + hobbyFiveChildTwo.work);System.out.println("hobby index 4 child index 2: " + hobbyFiveChildThree);
运行后打印:解析OK!
相比于Gson,懒人的JSON解析方式不需要程序员自己编写entity类,且支持复杂的JSON体解析,另外通用的解析方式,支持不同内容的JSON体的解析。
- 懒人的JSON解析方式的实现:
1. JSON数据对应的Entity类的自动生成:
深度遍历,每一个JSONObject生成一个类,使用FreeMaker生成.Java文件。
JSONObject对应Entity类的生成规则:
基础数据类型对应基础FiledType,JSONObject对应一个类,JSONArray对应Object[]。
JSONArray里面的JSONObject对应Entity类的生成规则:
JSONArray里面的JSONArray里面的JSONObject的Entity类生成规则:
2. JSON数据的自动解析:
通过反射的方式获取Entity类的fields,然后深度遍历赋值。
code:https://github.com/aceding/LazyJson
改进计划:JSONObject里面JSONObject作为静态内部类生成,而不是一个单独的Class存在。
- 一种适合懒人的JSON解析方法
- 一种简单的JSON解析方法
- Json解析的两种方法:一种Android自带的,一种第三方Gson
- 祛除装修异味的方法 总有一种适合你!
- 解析JSON的方法
- json解析的方法
- 有没有适合懒人养不用管的植物?
- 有没有适合懒人养不用管的植物?
- 维护PC的懒人方法
- json拼接一种方法
- C#解析json的方法
- json的js解析方法
- 关于解析JSON的方法
- c#解析json的方法
- 解析非标准json的方法
- 解析json的两个方法
- 解析json的总结方法
- java解析json的方法
- [leetcode]367. Valid Perfect Square
- 第二次课笔记
- 2016 Bluebridge cut_stamps
- 第二章 数据模型
- jvm_outofmemory_JavaVMStackOOM
- 一种适合懒人的JSON解析方法
- Android 沉浸式状态栏的实现方法、状态栏透明
- 折半查找
- jvm_outofmemory_JavaVMStackSOF
- python正则表达式
- 关于IAR报 more than one storage class may not be specified 错误的问题
- Codeforces Round #406 (Div. 2) E. Till I Collapse
- OSG入门_场景图形与OpenSceneGraph概述02
- golang实现简易TCP服务以及TCP和UDP协议对比