前言:從這篇文章開始宋下,正式進(jìn)入本人的網(wǎng)絡(luò)和數(shù)據(jù)通信方面的修煉和學(xué)習(xí)咙好,期間會(huì)持續(xù)有數(shù)據(jù)通信相關(guān)的學(xué)習(xí)文章發(fā)布。
一碱璃、JSON學(xué)習(xí)網(wǎng)站介紹
二惊窖、org.json基本用法
注意:
- json是Android SDK官方的庫。
- Java中要用到org.json【也就是用到常見的JSONObject或JSONArray類等】厘贼,前提是導(dǎo)入 org.json jar包。目前常用的如:
org.codeartisans:org.json
圣拄,也自行上網(wǎng)下載或Maven倉庫查找導(dǎo)入嘴秸。
1. 普通JSONObject對(duì)象的構(gòu)建
public static JSONObject createJson(){
JSONObject object = new JSONObject();
object.put("name", "王小明");
object.put("age", 18.2);
object.put("birthday", "1990-01-01");
object.put("school", "藍(lán)翔");
object.put("major", new String[]{"搬磚","挖掘機(jī)"};
object.put("car",nullObj);
object.put("comment", "這是注釋");
return object;
}
2. 通過Map,構(gòu)建json
public static JSONObject createJsonByMap(){
Map<String,Object> map = new HashMap<String, Object>();
Object nullObj = null;
map.put("name", "王小明");
map.put("age", 18.2);
map.put("birthday", "1990-01-01");
map.put("school", "藍(lán)翔");
map.put("major", new String[]{"搬磚","挖掘機(jī)"};
map.put("car",nullObj);
map.put("comment", "這是注釋");
return new JSONObject(map);
}
3. 通過Bean對(duì)象創(chuàng)建JsonObject對(duì)象
// 新建一個(gè)Bean對(duì)象庇谆,并提供getter和setting方法岳掐,注意:1.bean對(duì)象的成員,是:String饭耳、基本數(shù)據(jù)類型串述、Object類型
public static JSONObject createJsonByBean(){
Person xiaoming = new Person();
xiaoming.setName("王小明");
//......
xiaoming.setCar(null);
//.......
return new JSONObject(xiaoming);
}
4. 讀取.json文件中的內(nèi)容,并解析成JSONObject對(duì)象
//用到:org.apache.commons.io.FileUtils 文件
public static void main(String[] args) throws IOException {
File file = new File(JsonTest.class.getResource("/basic/json/test.json").getFile());
String content = readFileToString(file);
System.out.println(content);
JSONObject jsonObject = new JSONObject(content);
if (!jsonObject.isNull("name")) {
System.out.println(jsonObject.getString("name"));
}
JSONArray array = jsonObject.getJSONArray("major");
for(int i=0;i<array.length();i++){
System.out.println("major: "+ array.get(i));
}
}
三寞肖、GSON
包:com.google.gson
1.用法:
- 【序列化】解析Bean對(duì)象纲酗,變成json串
Gson gson = new Gson();
String jsonStr = gson.toJson(bean對(duì)象);
<u>復(fù)雜對(duì)象的情況可以參考以下的反序列化中的復(fù)雜類的例子,注意靜態(tài)內(nèi)部類的寫法新蟆。</u>
- 【反序列化】json串變成POJO對(duì)象
- 解析簡(jiǎn)單類型對(duì)象
Gson gson = new Gson();
int i = gson.fromJson("100", int.class);
double d = gson.toJson("\"9.9\"", double.class);
String s = gson.toJson("ABC", String.class);
Bean bean = gson.toJson(json字符串 , Bean.class);//最終轉(zhuǎn)成Object對(duì)象
/// ..............................
///其中Bean的成員是簡(jiǎn)單類型
public class Bean{
private int id;
private int age;
private String name;
/// getter觅赊、setter等
}
- 方式二:解析復(fù)雜對(duì)象
如果我的Bean對(duì)象中的成員帶有List<>類型或Object子類等:
public class Bean{
private int id;
private int age;
private Address address;
private List<Friend> friends;
////自動(dòng)反序列化的話,必須寫成靜態(tài)內(nèi)部類的形式G淼尽吮螺!
public static class Address{
public String street;
public String city;
public String province;
}
public static class Friend{
public String name;
public String phoneNumber;
}
/// getter、setter等
}
然后,解析方法為:
Gson gson = new Gson();
Bean bean = gson.fromJson(json串, Bean.class);
//或者
Type type = new TypeToken<Bean>(){}.getType();
Bean bean = gson.fromJson(json串鸠补,type);
當(dāng)Bean對(duì)象中存在 List<String>類型或者Set<String>類型萝风,而不是String[]時(shí),GSON同樣可以將json串中的數(shù)組或集合解析出來紫岩,并以GSON默認(rèn)的集合類型來構(gòu)建规惰,如下:
* List<String> -> ArrayList<String>
* Set<String> -> LinkedHashSet<String>
- Builder監(jiān)聽解析過程
//.....
gsonBuilder.setFieldNamingStrategy(new FieldNamingStrategy(){
public String translateName(Field f){
if(f.getName().equals("name")){//改名(注意這里,與注釋:@SerialzedName("name")是有沖突的被因,這個(gè)時(shí)候卿拴,注釋優(yōu)先級(jí)更大)
return "NAME";
}
return f.getName();
}
});
//.....
2. 強(qiáng)大之處:
-
@SerializedName("NAME")
可以將Bean類的成員name,更名為NAME梨与,并轉(zhuǎn)為json堕花,如:
public class Bean{
@SerializedName("NAME")
private String name;
//......
}
在轉(zhuǎn)換時(shí),將得到:
{"NAME": "小明", ……}
而不是
{"name": "小明", ……}
- Object轉(zhuǎn)json串過程中粥鞋,忽略某個(gè)屬性:
- 方式一:Bean類中缘挽,可以聲明一個(gè)成員屬性,如:
private transient String ignore;
這樣一來呻粹,這個(gè)成員屬性壕曼,就不會(huì)被解析成json串當(dāng)中。 - 方式二:如果這個(gè)成員屬性是String或者默認(rèn)為null的類型等浊,那么腮郊, 只要不初始化此屬性,默認(rèn)解析過程中筹燕,不會(huì)被解析到j(luò)son串中轧飞。
- 支持Data日期類型
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd").create();
- GsonBuilder
通過GsonBuilder配置Gson對(duì)象,去達(dá)到更多效果的解析:
Gson gson = new GsonBuilder()
//序列化null
.serializeNulls()
// 設(shè)置日期時(shí)間格式撒踪,另有2個(gè)重載方法
// 在序列化和反序化時(shí)均生效
.setDateFormat("yyyy-MM-dd")
// 禁此序列化內(nèi)部類
.disableInnerClassSerialization()
//生成不可執(zhí)行的Json(多了<u> ')]}' </u>這4個(gè)字符)
.generateNonExecutableJson()
//禁止轉(zhuǎn)義html標(biāo)簽
.disableHtmlEscaping()
//格式化輸出
.setPrettyPrinting()
.create();