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

一,什么是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之间转换的方法,在此挑了几个方法简单讲一下,其他方法大家就自己尝试着学习一下(不难的)

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

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":["看电影","看书"]}

也就是这个效果

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中

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值