一种适合懒人的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存在。

0 0
原创粉丝点击