欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Json学习(一)传统的Json解析

程序员文章站 2022-03-26 21:47:28
...

一,什么是Json?

说道Json,不得不说程序员和XML的那段孽缘。XML有一定的优越性比如适合在网络上传输(本身是纯文本文件),但是由于规范太多,像什么DTD,XSTL等啊,XML反而变得很复杂,成为了一个历史遗留的病垢吧。后来Json就出现了,Json作为一种轻量级的数据交换形式,抑郁阅读和编写,也易于机器解析和生成。总之,相比于XML,Json更加易于网络传输,重在简易语法,而XML则重在规范,也正是由于规范,所以数据看起来有条有理,而Json则比较不够规整,但是网上有大量的Json解析工具,寡人正在使用的是浏览器插件JSON-handle,大家可以自行搜索。

二.Json的数据类型

number:数值类型

boolean:布尔类型(true和false)

string:字符串类型

array:数组类型

object:对象类型

下面是解析工具的效果及例子:

Json学习(一)传统的Json解析

三,json的解析 

有很多种数据与Json之间转换的方法,在此挑了几个方法简单讲一下,其他方法大家就自己尝试着学习一下(不难的)

当我们想要new出一个JSONObject对象时,有很多种初始化的创建方法

Json学习(一)传统的Json解析

1. Map转化为Json(使用率非常高),由上图第一处红框可知我们创建JSONObject对象时传入一个Map那么Map中的数据就自动转化为了Json格式,先初始化一个HashMap

        Object obj = null;
        map=new HashMap<String, Object>();
        hashMap.put("name", "lisi");
        hashMap.put("age", 15);
        hashMap.put("likes", new String[]{"看电影", "看书"});
        hashMap.put("some", obj);

然后创建JSONObject对象

		json=new JSONObject(maps);
		
		System.out.println(json.toString());

 打印json的数据

{"hasGirlfriend":true,"name":"张三","birth":"1998-01-01","age":20,"likes":["看电影","看书"]}

也就是这个效果

Json学习(一)传统的Json解析

2.Json与JavaBean也就是 DTO的转化,同样由上图第二处红框可知传入一个Bean对象即可将Bean对象转化为Json数据

先创建一个Bean对象Student

public class StudentInfo {
	
	private String name;
	private String address;
	private double age;
	private transient String ingore;
	private List<String> likes;
	private Date birth;
	public List<String> getLikes() {
		return likes;
	}
	public void setLikes(List<String> likes) {
		this.likes = likes;
	}
	public Date getBirth() {
		return birth;
	}
	public void setBirth(Date birth) {
		this.birth = birth;
	}
	public StudentInfo() {
		
	}
	public StudentInfo(String name, String address, int age,String ingore) {
		super();
		this.name = name;
		this.address = address;
		this.age = age;
		this.ingore=ingore;
	}
	public String getIngore() {
		return ingore;
	}
	public void setIngore(String ingore) {
		this.ingore = ingore;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public double getAge() {
		return age;
	}
	public void setAge(double age) {
		this.age = age;
	}
	
	 
}

然后创建Bean的实例

        student=new StudentInfo();
        student.setAddress("苏州");
        student.setAge(15);
        student.setName("zhansan");

紧接着初始化json

		json=new JSONObject(student);
		double age=json.getDouble("age");

		System.out.println(age);
		System.out.println(json.toString());

从json中获取Bean对象的"age"属性并打印json数据

15.0
{"address":"苏州","name":"zhansan","age":15}

3.从文件中读取数据封装为Json

首先创建一个文件存储数据,可以直接在开发工具上创建json的文件,new--->other,然后搜索json,创建文件

提前在文件中输入一些数据便于获取进行封装,

{"hasGirlfriend":true,"name":"李四","birth":"1998-01-01","age":20.2,"likes":["篮球","足球宝贝"],"major":{"some":15,"adr":"vde"},"address":"eijng"}

然后开始解析文件,由于对文件进行读取,所以写在异常处理块中

        File file=new File(App.class.getResource("/student.json").getFile());
		try {
			String content=FileUtils.readFileToString(file);
			JSONObject json=new JSONObject(content);
			
			JSONArray jarray=json.getJSONArray("likes");
			
			for (int i = 0; i < jarray.length(); i++) {
				System.out.println(jarray.get(i));
			}
			System.out.println(json.getString("name"));
                        System.out.println(json.toString());
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

实际上是将文件的信息用文件工具类FileUtils读取到字符串中,然后用带有数据的字符串进行Json的转换(所以说利用字符串也可以直接实现数据的转换),由于之前文件的数据的"likes"是个数组,而接收数组数据时需要使用JSONArray;

篮球
足球宝贝
李四
{"address":"eijng","major":{"some":15,"adr":"vde"},"hasGirlfriend":true,"name":"李四","birth":"1998-01-01","age":20.2,"likes":["篮球","足球宝贝"]}

 Json是一种常用的数据类型之一,便于我们开发人员将数据进行封装和转移,更主要的是便于处理,所以,对Json一定要花一点时间去学习

最后,我们来一起看一下 Map转化为JSONObject的源码(不难的)

 public JSONObject(Map<?, ?> m) {
        if (m == null) {
            this.map = new HashMap<String, Object>();
        } else {
            this.map = new HashMap<String, Object>(m.size());
        	for (final Entry<?, ?> e : m.entrySet()) {
                final Object value = e.getValue();
                if (value != null) {
                    this.map.put(String.valueOf(e.getKey()), wrap(value));
                }
            }
        }
    }

首先进行非空判断,若空返回一个HashMap<String, Object>()

若非空遍历HashMap<String, Object>(),此处可以理解为获得map中所有的键值对对象的集合,也就是m.entrySet()

由每个键值对对象获取值,(注意值是Object类型),若果值非空,将键和值put到新的HashMap中

 

相关标签: Json