栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

fastJson解析字符串,并转为java对象

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

fastJson解析字符串,并转为java对象

JSON是什么
  • JSON 指的是 Javascript 对象表示法(JavaScript Object Notation)
  • JSON 是轻量级的文本数据交换格式
  • JSON 独立于语言:虽然JSON 使用 JS语法来描述对象,但是独立于语言和平台。
  • JSON 解析器和 JSON 库支持不同的编程语言,(PHP,JSP,.NET,JAVA)等编程语言都支持JSON。
  • JSON 具有自我描述性,它比比XML 更小、更快,更易解析
常用方法

json字符串—>对象

// json字符串转换为JSONObject对象
JSONObject parseObject(String jsonString)
// json字符串转换为JSONArray对象
JSONArray parseArray(String jsonString)

// json字符串转换为javaBean
T parseObject(String jsonString, Class clazz)
List parseArray(String jsonString, Class clazz)

对象—>json字符串

String toJSONString(Object object)
解析JSON字符串
{"112":{"name":"黄晓明","score":55},"113":{"name":"赵薇","score":63},"114":{"name":"陈坤","score":87},"115":{"name":"周迅","score":82}}

JSON格式:

{
	"112": {
		"name": "黄晓明",
		"score": 55
	},
	"113": {
		"name": "赵薇",
		"score": 63
	},
	"114": {
		"name": "陈坤",
		"score": 87
	},
	"115": {
		"name": "周迅",
		"score": 82
	}
}

首先要明白,以 { } 开头的是JSONObject,以 [ ] 开头的是JSONArray

    @Test
    public void testJson01() {
        String  str = "{"112":{"name":"黄晓明","score":55},"113":{"name":"赵薇","score":63},"114":{"name":"陈坤","score":87},"115":{"name":"周迅","score":82}}";
        // 解析字符串,先将其转为JSONObject对象
        JSONObject jsonObject = JSONObject.parseObject(str);
        // 获取所有key的集合
        Set keySet = jsonObject.keySet();
        Iterator iterator = keySet.iterator();
        // 迭代遍历
        while (iterator.hasNext()){
            JSONObject jb = jsonObject.getJSONObject(iterator.next());
            System.out.print(jb.getString("name"));
            System.out.println(jb.getInteger("score"));
        }
    }

运行结果:

解析JSON数组
[{"name":"Java","pId":100},{"name":"Spring框架","pId":888},{"name":"MySQL数据库","pId":999}]

JSON格式:

[
    {
        "name": "Java", 
        "pId": 100
    }, 
    {
        "name": "Spring框架", 
        "pId": 888
    }, 
    {
        "name": "MySQL数据库", 
        "pId": 999
    }
]

Java代码实现:

@Test
    public void testJson02() {
        String  str = "[{"name":"Java","pId":100},{"name":"Spring框架","pId":888},{"name":"MySQL数据库","pId":999}]";
        // 解析字符串,将其转为JSONArray对象
        JSONArray array = JSONObject.parseArray(str);
        
        //迭代遍历方式A
        for (int i = 0; i < array .size(); i++) {
              JSONObject jb = array .getJSONObject(i);
              System.out.println(jb.getString("name"));
              System.out.println(jb.getString("pId"));
        }
        //迭代遍历方式B
        for (Object o : array ) {
              JSONObject s =  (JSONObject)o;
              System.out.println(s.getString("name"));
              System.out.println(s.getString("pId"));
        }
    }

运行结果:

要解析的JSON字符串

{
	"errcode": 0,
	"errmsg": "ok",
	"result": {
		"auto_add_user": true,
		"dept_id": 35,
		"dept_permits": [],
		"extention": "{"faceCount":"657"}",
		"hide_dept": false,
		"name": "layman",
		"user_permits": []
	},
	"request_id": "iyptirsmnxy5"
}
解析复杂Json字符串
{'teacherName':'crystall','teacherAge':27,'course':{'courseName':'english','code':1270},'students':[{'studentName':'lily','studentAge':12},{'studentName':'lucy','studentAge':15}]}

Json格式:

{
    "teacherName": "crystall", 
    "teacherAge": 27, 
    "course": {
        "courseName": "english", 
        "code": 1270
    }, 
    "students": [
        {
            "studentName": "lily", 
            "studentAge": 12
        }, 
        {
            "studentName": "lucy", 
            "studentAge": 15
        }
    ]
}

java代码:

@Test
    public void testJson03() {
        String  str = "{'teacherName':'layman','teacherAge':27,'course':{'courseName':'english','code':1270},'students':[{'studentName':'lily','studentAge':12},{'studentName':'lucy','studentAge':15}]}";
        
        JSONObject jb = JSONObject.parseObject(str);
        String teacherName = jb.getString("teacherName");
        Integer teacherAge = jb.getInteger("teacherAge");
        JSONObject course = jb.getJSONObject("course");
        JSONArray students = jb.getJSONArray("students");

        System.out.println(teacherName);
        System.out.println(teacherAge);
        System.out.println(course);
        System.out.println(students);
    }
把Json字符串直接转化为对象

以上面的复杂字符串为例子

{'teacherName':'crystall','teacherAge':27,'course':{'courseName':'english','code':1270},'students':[{'studentName':'lily','studentAge':12},{'studentName':'lucy','studentAge':15}]}

新建实体类teacher :

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

import java.util.List;

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Teacher{

    private String teacherName;
    private Integer age;
    private Course course;
    private List Student;
}

新建实体类Student

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Student {
    @JSONField(name = "studentName")
    private String studentName;
    @JSONField(name = "studentAge")
    private Integer studentAge;
}

新建实体类Course

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Course {
    private String name;
    private Integer code;
}

转换方法:

@Test
    public void testJson04() {
        String  str = "{'teacherName':'layman','teacherAge':27,'course':{'courseName':'english','code':1270},'students':[{'studentName':'lily','studentAge':12},{'studentName':'lucy','studentAge':15}]}";
        // 解析字符串,将其转为JSONArray对象
        Teacher teacher = JSON.parseObject(str, Teacher.class);
        System.out.println(teacher);
    }

运行结果:

可以看到,除了teacher中的teacherName属性有值外,其它的属性都没有值。

因为Json是根据key值去匹配变量名,如果变量名和key值不同,就会出现匹配不上,从而出现null值。

如何解决这个问题:

  • key值和变量名一一对应
  • 变量名上添加JSONField注解

进行teacher类的改造:

import com.alibaba.fastjson.annotation.JSONField;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.util.List;

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Teacher{

    @JSONField(name = "teacherAge")
    private String name;
    @JSONField(name = "teacherAge")
    private Integer age;
    private Course course;
    private List Student;
}

改造Course类:

import com.alibaba.fastjson.annotation.JSONField;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Course {
    @JSONField(name = "courseName")
    private String name;
    private Integer code;
}

重新运行,如下:

可以看到,Student这个类依然没有获取到。

为什么呢?

因为Json字符串中的key是:

students

而,Teacher类中的Field是

private List student;

students 和 List student并不匹配,少了个s

  • tips:Field和key的值需要一一对应(不区分大小写)
如何解决

在student添加注解

	@JSONField(name = "students")
    private List student;
修改后运行结果


推荐博客:
Jackson,Gson,Fastjson 的对比
Fastjson 汇总篇
JackSon使用篇

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/331715.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号