今天分享一些JSON&XML的小知识

今天分享一些json&xml的小知识
JSON是存储和交换文本信息的语法.
它采取完全独立于语言的文本格式.

JSON分为两种构建结构:

1.对象:名称/值,对的集合

{
"name": "张三",
"age": 18,
"sex": true
}

在这里插入图片描述
2.数组:值的有序列表

[ {
"name": "张三",
"age": 18,
"sex": true
},
{
"name": "李四",
"age": 19,
"sex": false
}]

在这里插入图片描述
2.具体形式
1.json以 key-value 的形式存储数据
2.key的取值为String类型
3.value 的取值 为String,boolean,Number,数组,object,null
4.json 串以{开始,以}结尾
5.json 串中数组是以[开始,以]结尾
6.json 串中Object是以{开始,以}结尾;

解析方式

gson
1.转为json字符串
1.获取需要的对象

Student stu = new Student();
stu.setName("张三");
stu.setAge(18);

2.格式化为字符串

Gson gson = new Gson();
//将 对象 转化成 json 字符串
String json = gson.toJson(stu)

2.解析成java对象
1.Gson的节点对象
jsonElement:所有节点但是jsonElement对象
JsonPrimitive : 基本的 数据类型的 节点 对象, JsonElement 的子类.
JsonNull : 代表 空节点 对象,即 有 key,value 为空,JsonElement 的子类.
JsonObject : 对象 数据类型的 节点 对象, JsonElement 的 子类.
JsonArray : 数组 数据类型的 节点 对象, JsonElement 的 子类.

2.jsonElement 的取值:
JsonPrimitive : value 的 取值对应 java 的
int,double,float,long,short,boolean,char,byte,String,BigDecimal,BigI nteger,Number
JsonObject : value 的取值对应 java 的 Object 对象.
JsonArray : value 的取值对应 java 的 List 及其子类对象.

3.解析对象
json解析成java对象

{“name”:”张三”,”age”:18,”sex”:true}
================================
Gson gson = new Gson();
// 将 json 转化成 java 对象
Student stu = gson.fromJson(json, Student.class);

json解析成 List

[ {"name":"a","age":18,"sex":true},
{"name":"b","age":19,"sex":false},
{"name":"c","age":20,"sex":true},
{"name":"d","age":21,"sex":false},
{"name":"e","age":22,"sex":true} ]
===========================
Gson gson = new Gson();
// 将 json 转化 成 List 泛型
List<Student> stus = gson.fromJson(json, new TypeToken<List<Student>>()
{}.getType());

json解析成map

{"a": {"name": "a","age": 20,"sex": true},"b": {"name": "b","age": 21,"sex": false},"c": {"name": "c","age": 22,"sex": true},"d": {"name": "d","age": 18,"sex": true}
=================================
Gson gson = new Gson();
// 将 json 转化成 Map 泛型了 TypeToken,它是 gson 提供的数据类型转换器
Map<String,Student> map = gson.fromJson(json, new
TypeToken<Map<String,Student>>()
{}.getType());

Json节点解析

@Test
	public void testParser() {
		String json = "{ \"flag\": true, \"uname\":\"admin\", \"data\": {\"name\": \"张三\", \"age\": 18, \"sex\": true},\"user\":{\"userId\":1,\"userName\":\"zhangsan\",\"userPwd\":\"123123\"} }";
		
		// 得到解析器
		JsonParser parser = new JsonParser();
		// 将json格式的字符串转换成JsonElement对象
		JsonElement element = parser.parse(json);
		// 根据文档结构,判断当前文档是何种类型的json对象
		JsonObject root = element.getAsJsonObject();
		
		// 解析 flag	基本类型
		JsonPrimitive primitive = root.getAsJsonPrimitive("flag");
		// 将基本类型转换成具体的数据类型
		boolean flag = primitive.getAsBoolean();
		System.out.println(flag);
		
		// 解析data	对象类型
		JsonObject object = root.getAsJsonObject("data");
		// 获取节点 name   基本类型
		JsonPrimitive primitive2 = object.getAsJsonPrimitive("name");
		String name = primitive2.getAsString();
		System.out.println(name);
		
		
		// 解析user
		JsonObject userObject = root.getAsJsonObject("user");
		User user = new Gson().fromJson(userObject, User.class);
		System.out.println(user.getUserName());
	}

fastjson

Fastjson 是一个 Java 语言编写的高性能功能完善的 JSON 库

1.转为json字符串

String jsonString = JSON.toJSONString(object);

2.解析成对象

1). JavaBean : Person person = JSON.parseObject(jsonString, Person.class); 
2). List : List listPerson =JSON.parseArray(jsonString, Person.class); 
3). List:List listString = JSON.parseArray(jsonString, String.class); 
4). List<Map> List<Map> listMap = JSON.parseObject(jsonString, new
TypeReference<List<Map>>(){});

3.实例

public class FastJsonTest {

	@Test
	public void testJavaToJson() {
		
		User user = new User(1,"zhangsan","123123");
		
		List<String> list = new ArrayList<>();
		list.add("aaa");
		list.add("bbb");
		list.add("bbb");
		
		List<User> userList = new ArrayList<>();
		User user2 = new User(2,"lisi","111111");
		User user3 = new User(3,"wangwu","234567");
		userList.add(user);
		userList.add(user2);
		userList.add(user3);
		
		
		Map<String,Object> map = new HashMap<>();
		map.put("user", user);
		map.put("list", userList);
		map.put("name", "admin");
		
		System.out.println(JSON.toJSONString(user));
		System.out.println(JSON.toJSONString(list));
		System.out.println(JSON.toJSONString(userList));
		System.out.println(JSON.toJSONString(map));
	}
	
	
	@Test
	public void testJsonToJava() {
		String json = "{\"userId\":1,\"userName\":\"zhangsan\",\"userPwd\":\"123123\"}";
		String json2 = "[\"aaa\",\"bbb\",\"bbb\"]";
		String json3 = "[{\"userId\":1,\"userName\":\"zhangsan\",\"userPwd\":\"123123\"},{\"userId\":2,\"userName\":\"lisi\",\"userPwd\":\"111111\"},{\"userId\":3,\"userName\":\"wangwu\",\"userPwd\":\"234567\"}]";
		
		
		User user = JSON.parseObject(json,User.class);
		List<String> list = JSON.parseArray(json2, String.class);
		List<User> userList = JSON.parseArray(json3, User.class);
		
		System.out.println(user.getUserName());
		System.out.println(list.get(0));
		System.out.println(userList.get(0).getUserPwd());
	}

}

XML

1.语法规范:

(1).必须有XML文档声明:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<?xml:	文本的开始,表示当前是xml文档
version:xml的版本,目前只有"1.0"
encoding:编码
standalone:xml文档是否独立,默认是yes
/>:xml文档声明结束

(2)必须有且仅有一个根元素
(3)严格区分大小写
(4)属性值用引号(双引号或单引号):等号分开的名称–值对;在一个元素上,相同的属性只能出现一次.
(5)标记成对
(6)空标记关闭
(7)元素正确嵌套
PS:保存时需要手动改成UTF-8保存.

2.元素命名规则

(1)、名称中可以包含字母、数字或者其他可见字符;
(2)、名称不能以数字开头;
(3)、不能以 XML/xml/Xml…开头;
(4)、名称中不能含空格;
(5)、名称中不能含冒号(注:冒号留给命名空间使用)

3.实体

实体叫 ENTITY,实体的作用是避免重复输入.作用相当于或者变量
(1)内置的5种实体
实体 	符号
&lt;  	 <
&gt   	 >
&amp; 	 &
&quot; 	 "
&apos;	 '

(2)自定义实体
<!DOCTYPE 跟元素[
<!ENTITY 实体名 "实体内容">
]>
使用已定义的实体:&实体名;

4.文档类型声明
文档类型定义—DOCTYPE,文档类型声明,紧跟XML声明之后,包含所有实体声明

5.CDATA

用于把整段文本解释为纯字符数据而不是标记的情况.如包含大量的<,>,&,或者"字符.
CDATA 节中的所有字符都会被当做元素字符数据的常量部分,而不是XML标记,可以输入除]]>外任意字符,不能嵌套。
<![CDATA[ ...... ]]>	

6.PCDATA

PCDATA 的意思是被解析的字符数据(parsed character data)。
可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。

XML解析

基本的解析方式有两种:一种叫 SAX,另一种叫 DOM。
SAX(Simple API for XML)是基于事件流的解析,DOM(Document Object Model)是基于 XML 文档树结构的解析。
SAX:效率高,数据量小,仅一次获取 
DOM:整颗树加载到内存中,耗内存,可多次获取。
 <people>
 	<person sex="man">Hello
 		<name>zhangsan</name>
 		<age>18</age>
 	</person>
 	<person sex="woman">
 		<name>lisi</name>
 		<age>19</age>
 	</person>
 	<person sex="woman">
 		<name>&lt;p&gt;明明&lt;/p&gt;</name>
 		<age>19</age>
 	</person>
 	<!-- 使用自定义实体  -->
 	<person >
 		<name>&uname;</name>
 		<age>&uage;</age>
 	</person>
 	<desc>
 	<![CDATA[
	 	战国时期,芈月是楚威王最宠爱的小公主,但<desc>在楚威王死后生活一落千丈,母亲向氏被楚威后逐出宫,芈月和弟弟芈戎躲过了一次次灾难和危机。
		芈月与楚公子黄歇青梅竹马,真心相爱,但被作为嫡公主芈姝的陪嫁媵侍远嫁秦国。芈姝当上了秦国的王后,芈月不得已成为宠妃...
	]]>
</desc>
 
 </people>

DOM4j 解析

public class Dom4JWriter {

	public static void main(String[] args) throws Exception {
		
		// 使用DocumentHelper来创建 Document对象
		Document document = DocumentHelper.createDocument();
		// 创建元素并设置关系
		Element person = document.addElement("person");
		Element name = person.addElement("name");
		Element age = person.addElement("age");
		// 设置文本
		name.setText("shsxt");
		age.setText("10");
		// 创建格式化输出器
		OutputFormat of = OutputFormat.createPrettyPrint();
		of.setEncoding("utf-8");
		// 输出到文件
		File file = new File("src/outputdom4j.xml");
		XMLWriter writer = new XMLWriter(new FileOutputStream(new File(file.getAbsolutePath())),of);
		// 写出
		writer.write(document);
		writer.flush();
		writer.close();
		
	}
}

 Dom4J解析XML文档
1、得到要解析的文件对象
2、得到解析器
3、通过解析器将文件对象转换成Document对象
4、得到当前文档对象的根节点
5、得到 根节点的所有子节点,返回迭代器
6、遍历,得到每一个子节点的名称和值

public class Dom4JReader {
	
	public static void main(String[] args) throws Exception {
		
		// 1、得到要解析的文件对象
		File file = new File("src/test.xml");
		// 2、得到解析器
		SAXReader reader = new SAXReader();
		// 3、通过解析器将文件对象转换成Document对象
		Document document = reader.read(file);
		// 4、得到当前文档对象的根节点
		Element root = document.getRootElement();
		// 5、得到 根节点的所有子节点,返回迭代器
		Iterator<Element> iterator = root.elementIterator();
		// 6、遍历,得到每一个子节点的名称和值
		while(iterator.hasNext()) {
			Element el = iterator.next();
			System.out.println(el.getName());
			System.out.println(el.getText());
		}
		
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值