今天分享一些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种实体
实体 符号
< <
> >
& &
" "
' '
(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><p>明明</p></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());
}
}
}