fastJson

用原生操作json的方法过于复杂,所以fastJSON库提供了更为简单的方法
1 需要在项目中引入fastjson的jar包或者直接在gradle中引入fastjson
2 fastjson中的提供了多种静态方法,用JSON.方法名()进行调用

根据json字符串创建实体类

实际开发中json字符串都要转化成相应的实体类然后再进行操作的,所以需要首先根据json字符串创建相应的实体类
[]对应list
{}对应实体类
嵌套的json就需要创建多个实体类
json格式如下

{
    "id": 1,
    "name": "Teacher 1",
    "students": [
        {
            "age": 18,
            "id": 0,
            "name": "Student0"
        },
        {
            "age": 19,
            "id": 1,
            "name": "Student1"
        }
    ]
}```
创建对应的两个实体类
最大的类是一个Teacher类,它里面还有一个JSONObject的对象对应学生类,所以还需要创建一个学生类,Student类的对象是Teacher类的成员变量,而且是一个LIst类型的成员变量
注意事项
1 实体类中成员变量的名称必须和json中的key完全相同
例如Teacher类中的id,name,students
Student类中的age,id,name
实体类的类名可以自定义,无所谓
2 每个实体类必须都要有一个无参的空构造函数
上面的json对应的实体类如下
Teacher类

public class Teacher {
private int id;
private String name;
private List<Student> students;
public Teacher(){}
public String getName() {
return name;
}

public void setName(String name) {
    this.name = name;
}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public List<Student> getStudents() {
    return students;
}

public void setStudents(List<Student> students) {
    this.students = students;
}

@Override
public String toString() {
    return "Teacher{" +
            "id=" + id +
            ", name='" + name + '\'' +
            ", students=" + students +
            '}';
}

}

Student类

public class Student {
private int id;
private String name;
private int age;
public Student(){}
public int getAge() {
return age;
}

public void setAge(int age) {
    this.age = age;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}
@Override
public String toString() {
    return "Student{" +
            "id=" + id +
            ", name=" + name +
            ", age=" + age +
            '}';
}

}

######解析
1 JSON.parse(String json)
传入一个json字符串,返回JSONObject或者JSONArray对象
如果json字符串是jsonObject类型的就返回JSONObject对象
如果json字符串是jsonArray类型的就返回JSONArray对象
但是需要类型转换

JSONObject object= (JSONObject) JSON.parse(json);
JSONArray array=(JSONArray)JSON.parse(json1);

2 JSON.parseObject(String json)
将json字符串转化为JSONObject对象

JSONObject object= JSON.parseObject(json);

3 JSON.parseArray(String json)
将json字符串转化为JSONArray对象

JSONArray array=JSON.parseArray(json1);

4 parseObject(String text, Class<T> clazz); 
  传入jsonObject类型的json字符串,和对应的实体类的类名.class,直接将json字符串转化为实体类
以最开始给出的字符串和实体类为例

Teacher teacher=JSON.parseObject(json,Teacher.class);

一行代码搞定,调用teacher中的get方法就可以获得对应的数据。
5 parseArray(String text, Class<T> clazz);
如果是一个jsonArray类型的json字符串,里面的每一个就可以按照里面的jsonObject类型的字符串建立实体类,然后用parseArray方法获取实体类列表
例如是这样一组格式的json

[
{
"id": 1,
"name": "Teacher 1",
"students": [
{
"age": 18,
"id": 0,
"name": "Student0"
},
{
"age": 19,
"id": 1,
"name": "Student1"
}
]
},
{
"id": 2,
"name": "Teacher 2",
"students": [
{
"age": 18,
"id":3,
"name": "Student3"
},
{
"age": 19,
"id":4,
"name": "Student4"
}
]
}
]

对应的实体类还是Teacher类

List<Teacher> teacher=JSON.parseArray(json,Teacher.class);

这样便得到了实体类的list对象
######构造json字符串
1 JSON.toJSONString(Object o)
可以传入实体类对象,或者传入实体类的list,得到相应的json字符串
传入实体类对象

//创建一个Teacher类的对象,并赋值
Teacher teacher=new Teacher();
teacher.setName("teacher"+1);
teacher.setId(1);
List<Student> students=new ArrayList<>();
for(int i=0;i<3;i++)
{
Student student=new Student();
student.setAge(i);
student.setId(i);
student.setName("aaa"+i);
}
teacher.setStudents(students);
//转化成json字符串
String jsonString= JSON.toJSONString(teacher);
Log.i("test",jsonString);

{"id":1,"name":"teacher1","students":[{"age":0,"id":0,"name":"aaa0"},{"age":1,"id":1,"name":"aaa1"},{"age":2,"id":2,"name":"aaa2"}]}

传入实体类list

//创建Teacher的list
List<Teacher> teachers=new ArrayList<>();
for(int j=0;j<4;j++)
{
//创建一个Teacher类的对象,并赋值
Teacher teacher=new Teacher();
teacher.setName("teacher"+j);
teacher.setId(1);
List<Student> students=new ArrayList<>();
for(int i=0;i<3;i++)
{
Student student=new Student();
student.setAge(i);
student.setId(i);
student.setName("aaa"+i);
students.add(student);
}
teacher.setStudents(students);
teachers.add(teacher);
}

    //转化成json字符串
    String jsonString= JSON.toJSONString(teachers);

[{"id":1,"name":"teacher0","students":[{"age":0,"id":0,"name":"aaa0"},
{"age":1,"id":1,"name":"aaa1"},{"age":2,"id":2,"name":"aaa2"}]},
{"id":1,"name":"teacher1","students":[{"age":0,"id":0,"name":"aaa0"},
{"age":1,"id":1,"name":"aaa1"},{"age":2,"id":2,"name":"aaa2"}]},
{"id":1,"name":"teacher2","students":[{"age":0,"id":0,"name":"aaa0"},
{"age":1,"id":1,"name":"aaa1"},{"age":2,"id":2,"name":"aaa2"}]},
{"id":1,"name":"teacher3","students":[{"age":0,"id":0,"name":"aaa0"},
{"age":1,"id":1,"name":"aaa1"},{"age":2,"id":2,"name":"aaa2"}]}]



2 JSON.toJSONString(Object o, boolean prettyFormat)
和上面的相比多了一个参数,代表是否要讲字符串转化成json标准格式,如果传入false。就和上面一样,如果传入true,就是下面这样的,但是实质上没有区别,只是展示上美观与否的问题
传入实体类

{
"id": 1,
"name": "teacher1",
"students": [
{
"age": 0,
"id": 0,
"name": "aaa0"
},
{
"age": 1,
"id": 1,
"name": "aaa1"
},
{
"age": 2,
"id": 2,
"name": "aaa2"
}
]
}```
传入实体类list
就不贴了

最后一个方法

JSON.toJSON(Object o)
该方法将实体类或者实体类list转化成JSONObject或者JSONArray对象
转化为JSONObject,其中teacher是一个实体类对象

JSONArray array=(JSONArray) JSON.toJSON(teachers);

转化为JSONArray,其中teachers是一个实体类list
···
JSONObject object=(JSONObject) JSON.toJSON(teacher);
···
这个方法感觉实际用处不是很大

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容