9、JSON
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 JSON 官方:http://www.json.org
JSON 数据格式的特点
JSON 建构于两种结构:
1、 “名称/值”对的集合
2.、 值的有序列表(数组)
JSON 表示名称 / 值对的方式 :{ “firstName”: “vince”,“lastName”:“ma”,“email”:“finally_m@foxmail.com” }
表示数组
{ “user”: [{ “firstName”: “vince”,“lastName”:“ma”,“email”: “finally_m@foxmail.com” },
{ “firstName”: “lin”,“lastName”:“jacks”,“email”: “jacks@qq.com”}]
}
10、GSON组件的使用
GSON是Google开发的Java API,用于转换Java对象和Json对象。
下载地址:http://www.mvnrepository.com/artifact/com.google.code.gson/gson
解析JSON:JsonReader reader = new JsonReader(new StringReader(jsonData));
生成JSON:
private String createJSON(ArrayList users) {
JSONObject jsonObject = new JSONObject();JSONArray array = new JSONArray();
int size = users.size();
try {for (int i = 0; i < size; i++) {
User user = users.get(i); JSONObject object = new JSONObject();
object.put(“name”, user.name);object.put(“age”, user.age);array.put(object);}
jsonObject.put(“users”,array);
return jsonObject.toString();
} catch (JSONException e) {e.printStackTrace();}
return null;
}
static class User {String name; int age;//…}
[
{
"id": 912345678901,
"text": "How do I read a JSON stream in Java?",
"geo": null,
"user": {
"name": "json_newb",
"followers_count": 41
}
},
{
"id": 912345678902,
"text": "@json_newb just use JsonReader!",
"geo": [50.454722, -104.606667],
"user": {
"name": "jesse",
"followers_count": 2
}
}
]
public class User {
private String name;
private int followers_count;
public User() {
}
public User(String name, int followers_count) {
this.name = name;
this.followers_count = followers_count;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getFollowers_count() {
return followers_count;
}
public void setFollowers_count(int followers_count) {
this.followers_count = followers_count;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", followers_count=" + followers_count +
'}';
}
}
public class Message {
private long id;
private String text;
private ArrayList<Double> geo;
private User user;
public Message() {
}
public Message(int id, String text, ArrayList<Double> geo, User user) {
this.id = id;
this.text = text;
this.geo = geo;
this.user = user;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public ArrayList<Double> getGeo() {
return geo;
}
public void setGeo(ArrayList<Double> geo) {
this.geo = geo;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String toString() {
return "Message{" +
"id=" + id +
", text='" + text + '\'' +
", geo=" + geo +
", user=" + user +
'}';
}
}
public class JsonDemo2 {
/**
* 使用JsonReader解析复杂的JSON数据
*/
@Test
public void parseJSONMessages(){
InputStream is = Thread.currentThread().getContextClassLoader()
.getResourceAsStream("com/vince/json/message.json");
InputStreamReader in = new InputStreamReader(is);
JsonReader jsonReader = new JsonReader(in);
ArrayList<Message> list = readMessageArray(jsonReader);
for (Message m: list){
System.out.println(m);
}
}
//读取Message数组
private ArrayList<Message> readMessageArray(JsonReader jsonReader) {
ArrayList<Message> list = new ArrayList<>();
try {
jsonReader.beginArray();
while(jsonReader.hasNext()){
list.add(readMessage(jsonReader));
}
jsonReader.endArray();
} catch (IOException e) {
e.printStackTrace();
}
return list;
}
//解析一个Message对象
private Message readMessage(JsonReader jsonReader) {
Message m = new Message();
try {
jsonReader.beginObject();
while (jsonReader.hasNext()){
String name = jsonReader.nextName();
if("id".equals(name)){
m.setId(jsonReader.nextLong());
}else if("text".equals(name)){
m.setText(jsonReader.nextString());
}else if("geo".equals(name) && jsonReader.peek()!= JsonToken.NULL){
m.setGeo(readGeo(jsonReader));
}else if("user".equals(name)){
m.setUser(readUser(jsonReader));
}else{
jsonReader.skipValue();
}
}
jsonReader.endObject();
} catch (IOException e) {
e.printStackTrace();
}
return m;
}
/**
* 解析User对象
* @param jsonReader
* @return
*/
private User readUser(JsonReader jsonReader) {
User user = new User();
try {
jsonReader.beginObject();
while (jsonReader.hasNext()){
String name = jsonReader.nextName();
if("name".equals(name)){
user.setName(jsonReader.nextString());
}else if("followers_count".equals(name)){
user.setFollowers_count(jsonReader.nextInt());
}else{
jsonReader.skipValue();
}
}
jsonReader.endObject();
} catch (IOException e) {
e.printStackTrace();
}
return user;
}
/**
* 解析GEO
* @param jsonReader
* @return
*/
private ArrayList<Double> readGeo(JsonReader jsonReader) {
ArrayList<Double> list = new ArrayList<>();
try {
jsonReader.beginArray();
while (jsonReader.hasNext()){
list.add(jsonReader.nextDouble());
}
jsonReader.endArray();
} catch (IOException e) {
e.printStackTrace();
}
return list;
}
}
使用 Gson 直接把 JSON 数据转换成 Java 对象
public Student parserJSON2(String data){
Gson gson = new Gson();
Student s = gson.fromJson(data, Student.class);
return s;
}
使用 Gson 直接把 JSON 数组转换成 Java 对象
public List parserJSON3(String data){
Type type = new TypeToken<ArrayList>(){}.getType();
Gson gson = new Gson();
List list = gson.fromJson(data, type);
return list;
}
public class JsonDemo3 {
/**
* 把一组JSON对象转换成一个JAVA对象集合,或者把一个JAVA对象集合转换成JSON数组
*/
@Test
public void gson2(){
Gson gson = new Gson();
InputStream is = Thread.currentThread().getContextClassLoader()
.getResourceAsStream("com/vince/json/names.json");
InputStreamReader in = new InputStreamReader(is);
TypeToken<List<Name>> typeToken = new TypeToken<List<Name>>(){};
List<Name> list = gson.fromJson(in, typeToken.getType());
System.out.println(list);
String json = gson.toJson(list, typeToken.getType());
System.out.println(json);
}
class MyTypeToken extends TypeToken<List<Name>>{}
/**
* 把一个JSON对象转换成JAVA对象,或把一个JAVA对象转换成JSON对象
*/
@Test
public void gson1(){
Gson gson = new Gson();
InputStream is = Thread.currentThread().getContextClassLoader()
.getResourceAsStream("com/vince/json/name.json");
InputStreamReader in = new InputStreamReader(is);
Name name = gson.fromJson(in, Name.class);
System.out.println(name);
String json = gson.toJson(name);
System.out.println(json);
}
@Test
public void createJSON(){
List<Name> list = new ArrayList<>();
list.add(new Name("vince","ma","1791705739@qq.com"));
list.add(new Name("jack","wang","jack@qq.com"));
JsonArray array = new JsonArray();
for (Name n: list){
JsonObject obj = new JsonObject();
obj.addProperty("firstName",n.getFirstName());
obj.addProperty("lastName",n.getLastName());
obj.addProperty("email",n.getEmail());
array.add(obj);
}
System.out.println(array.toString());
}
}
11、XML与JSON的比较
从以下6点比较JSON与XML:
1、JSON和XML的数据可读性基本相同
2、JSON和XML同样拥有丰富的解析手段
3、JSON相对于XML来讲,数据的体积小
4、JSON与JavaScript的交互更加方便
5、JSON对数据的描述性比XML较差
6、JSON的速度要远远快于XML
适合的场景:
(1)数据传输:JSON要比XML更有优势
(2)存储数据:XML描述性更强
(3)XML通常用做配置文件(WEB课程中会有详细介绍)