1.基本使用php
2.高級使用git
3.源碼分析程序員
//經過構造函數來獲取 Gson gson = new Gson(); //經過 GsonBuilder 來獲取,能夠進行多項特殊配置 Gson gson = new GsonBuilder().create();
private static Gson gson = null; static { if (gson == null) { gson = new GsonBuilder() .setLenient()// json寬鬆 .enableComplexMapKeySerialization()//支持Map的key爲複雜對象的形式 .serializeNulls() //智能null .setPrettyPrinting()// 調教格式 .disableHtmlEscaping() .registerTypeAdapter(int.class, new JsonDeserializer<Integer>() {//根治服務端int 返回""空字符串 @Override public Integer deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { //try catch不影響效率 try { return json.getAsInt(); } catch (NumberFormatException e) { return 0; } } }) .create(); } } public static Gson getGson() { return gson; }
private void toJson() { JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("String", "leavesC"); jsonObject.addProperty("Number_Integer", 23); jsonObject.addProperty("Number_Double", 22.9); jsonObject.addProperty("Boolean", true); jsonObject.addProperty("Char", 'c'); //Log.e(TAG,jsonObject.getAsString()); //這個會崩潰 Log.e(TAG,jsonObject.toString()); Log.e(TAG,jsonObject+""); //{"String":"leavesC","Number_Integer":23,"Number_Double":22.9,"Boolean":true,"Char":"c"} //{"String":"leavesC","Number_Integer":23,"Number_Double":22.9,"Boolean":true,"Char":"c"} }
public void addProperty(String property, String value) { add(property, createJsonElement(value)); } public void addProperty(String property, Number value) { add(property, createJsonElement(value)); } public void addProperty(String property, Boolean value) { add(property, createJsonElement(value)); } public void addProperty(String property, Character value) { add(property, createJsonElement(value)); }
//注意這個方法返回JsonElement對象 private JsonElement createJsonElement(Object value) { return value == null ? JsonNull.INSTANCE : new JsonPrimitive(value); }
1.2.4 json解析步驟github
private void jsonToArray() { //Json數組 轉爲 字符串數組 String[] arr = {"2222","3333","4444","5555"}; //這種崩潰 //String jsonArray = "{\"2222\",\"3333\",\"4444\",\"5555\"}"; //這種正常 String jsonArray = "[\"2222\",\"3333\",\"4444\",\"5555\"]"; String[] strings = gson.fromJson(jsonArray, String[].class); System.out.println("Json數組 轉爲 字符串數組: "); for (String string : strings) { Log.e(TAG,string); } } 打印日誌: 2222 3333 4444 5555
private void arrayToJson() { String jsonArray = "[\"2222\",\"3333\",\"4444\",\"5555\"]"; //字符串數組 轉爲 Json數組 jsonArray = gson.toJson(jsonArray, new TypeToken<String>() {}.getType()); Log.e(TAG,jsonArray); //打印日誌 //"[\"2222\",\"3333\",\"4444\",\"5555\"]" }
private void jsonToList() { //Json數組 轉爲 List String jsonArray = "[\"2222\",\"3333\",\"4444\",\"5555\"]"; List<String> stringList = gson.fromJson(jsonArray, new TypeToken<List<String>>() {}.getType()); for (String string : stringList) { Log.e(TAG,string); } }
private void listToJson() { String jsonArray = "[\"2222\",\"3333\",\"4444\",\"5555\"]"; List<String> stringList = gson.fromJson(jsonArray, new TypeToken<List<String>>() {}.getType()); //List 轉爲 Json數組 jsonArray = gson.toJson(stringList, new TypeToken<List<String>>() {}.getType()); Log.e(TAG,jsonArray); //打印日誌 //["2222","3333","4444","5555"] }
private void listModelToJson() { Person model1 = new Person("yangChong", 25, true); Person model2 = new Person("doubi", 26, false); final ArrayList<Person> lists = new ArrayList<>(); lists.add(model1); lists.add(model2); Gson gson = new Gson(); String s = gson.toJson(lists); Log.e(TAG,s); //打印日誌 //[{"age":25,"name":"yangChong","sex":true},{"age":26,"name":"doubi","sex":false}] }
private void jsonToListMode() { String json = "[{\"age\":25,\"name\":\"yangChong\",\"sex\":true},{\"age\":26,\"name\":\"doubi\",\"sex\":false}]"; Gson gson = new Gson(); List<Person> list = gson.fromJson(json, new TypeToken<List<Person>>() {}.getType()); for (Person person : list) { Log.e(TAG,person.toString()); } //打印日誌 //Person{name='yangChong', age=25, sex=true} //Person{name='doubi', age=26, sex=false} }
private void personModelToJson() { //序列化 Person person = new Person("yangChong", 25, true); Gson gson = new Gson(); String s = gson.toJson(person); Log.e(TAG,s); //打印日誌 //{"age":25,"name":"yangChong","sex":true} }
private void jsonToPersonModel() { //反序列化 String userJson = "{\"age\":25,\"name\":\"yangChong\",\"sex\":true}"; Gson gson = new Gson(); Person person = gson.fromJson(userJson, Person.class); Log.e(TAG,person.toString()); //打印日誌 //Person{name='yangChong', age=25, sex=true} }
gson = new GsonBuilder() //builder構建者模式 .setLenient() //json寬鬆 .enableComplexMapKeySerialization() //支持Map的key爲複雜對象的形式 .setPrettyPrinting() //格式化輸出 .serializeNulls() //智能null //.setDateFormat("yyyy-MM-dd HH:mm:ss:SSS") //格式化時間 .disableHtmlEscaping() //默認是GSON把HTML轉義的 .registerTypeAdapter(int.class, new JsonDeserializer<Integer>() { //根治服務端int 返回""空字符串 @Override public Integer deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { //try catch不影響效率 try { return json.getAsInt(); } catch (NumberFormatException e) { return 0; } } }) .create();
這裏設定當 User 類序列化時 Json 中的Key值都是大寫字母開頭,反序列化時支持「name」和「Name」兩種不一樣的 Json 風格json
public class UserTypeAdapter extends TypeAdapter<User> { /** * 序列化 */ @Override public void write(JsonWriter jsonWriter, User user) throws IOException { //流式序列化成對象開始 jsonWriter.beginObject(); //將Json的Key值都指定爲大寫字母開頭 jsonWriter.name("Name").value(user.getName()); jsonWriter.name("Age").value(user.getAge()); jsonWriter.name("Sex").value(user.isSex()); //流式序列化結束 jsonWriter.endObject(); } /** * 反序列化 */ @Override public User read(JsonReader jsonReader) throws IOException { User user = new User(); //流式反序列化開始 jsonReader.beginObject(); while (jsonReader.hasNext()) { switch (jsonReader.nextName()) { //首字母大小寫均合法 case "userName": case "name": case "Name": user.setName(jsonReader.nextString()); break; case "age": user.setAge(jsonReader.nextInt()); break; case "sex": user.setSex(jsonReader.nextBoolean()); break; } } //流式反序列化結束 jsonReader.endObject(); return user; } }
/** * 序列化過程 */ @SuppressLint("LongLogTag") private void toJsonSerializer() { Gson gson = new GsonBuilder().registerTypeAdapter(User.class, new JsonSerializer<User>() { @Override public JsonElement serialize(User user, Type type, JsonSerializationContext jsonSerializationContext) { JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("NameHi", user.getName()); jsonObject.addProperty("Sex", user.isSex()); jsonObject.addProperty("Age", user.getAge()); return jsonObject; } }).create(); User user = new User("leavesC", 24, true); String s = gson.toJson(user); Log.e(TAG,s); }
/** * 反序列化過程 */ private void toJsonDeserializer() { Gson gson = new GsonBuilder().registerTypeAdapter(User.class, new JsonDeserializer<User>() { @Override public User deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { JsonObject jsonObject = jsonElement.getAsJsonObject(); String name = null; //同時支持 userName 和 name 兩種狀況 if (jsonObject.has("userName")) { name = jsonObject.get("userName").getAsString(); } else if (jsonObject.has("name")) { name = jsonObject.get("name").getAsString(); } int age = jsonObject.get("age").getAsInt(); boolean sex = jsonObject.get("sex").getAsBoolean(); return new User(name, age, sex); } }).create(); String json = "{\"userName\":\"leavesC\",\"sex\":true,\"age\":24}"; User user = gson.fromJson(json, User.class); System.out.println(); System.out.println(user); json = "{\"name\":\"leavesC\",\"sex\":true,\"age\":24}"; user = gson.fromJson(json, User.class); System.out.println(); System.out.println(user); }
private static final String LINE_SEPARATOR = System.getProperty("line.separator"); public static void printJson(String tag, String msg) { String message; try { if (msg.startsWith("{")) { JSONObject jsonObject = new JSONObject(msg); //最重要的方法,就一行,返回格式化的json字符串,其中的數字4是縮進字符數 message = jsonObject.toString(4); } else if (msg.startsWith("[")) { JSONArray jsonArray = new JSONArray(msg); message = jsonArray.toString(4); } else { message = msg; } } catch (JSONException e) { message = msg; } if(isGoodJson(message)){ printLine(tag, true); String[] lines = message.split(LINE_SEPARATOR); for (String line : lines) { Log.e(tag, "║ " + line); } printLine(tag, false); } } private static void printLine(String tag, boolean isTop) { if (isTop) { Log.e(tag, "Http---------------------"); } else { Log.e(tag, "Http---------------------"); } } private static boolean isGoodJson(String json) { if (TextUtils.isEmpty(json)) { return false; } try { new JsonParser().parse(json); return true; } catch (JsonSyntaxException e) { return false; } catch (JsonParseException e) { return false; } }