Gson [Maven依赖] 和一些简单的例子_gson maven依赖-程序员宅基地

技术标签: Gson  

Mavne依赖

<dependency>
   <groupId>com.google.code.gson</groupId>
   <artifactId>gson</artifactId>
   <version>2.2.4</version>
</dependency>

Gson jar包下载地址: http://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.0/  

 

Gson的实例化方式:

1:Gson gson=newGson();

2:通过GsonBuilder 可以配置多种选项

 

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. gson = new GsonBuilder()  
  2.                    .setLenient()// json宽松  
  3.                    .enableComplexMapKeySerialization()//支持Map的key为复杂对象的形式  
  4.                    .serializeNulls() //智能null  
  5.                    .setPrettyPrinting()// 调教格式  
  6.                    .disableHtmlEscaping() //默认是GSON把HTML 转义的  
  7.                    .create();  

Gson的基本用法:

 JavaBean转换Json字符串

 gson提供 publicString toJson(Object src) 方法可以将对象转换成jsonStr

  

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. package com.xuan.gson;  
  2.   
  3. import com.google.gson.Gson;  
  4.   
  5. /** 
  6.  * @author xuanyouwu 
  7.  * @email [email protected] 
  8.  * @time 2016-05-18 10:39 
  9.  */  
  10. public class GsonTest1 {  
  11.     public static class Student {  
  12.         private String name;  
  13.         private int age;  
  14.   
  15.         //省略setter getter equals  
  16.     }  
  17.   
  18.     private static void log(String msg) {  
  19.         System.out.println(msg);  
  20.     }  
  21.   
  22.   
  23.     public static void main(String[] args) throws Exception {  
  24.         Gson gson = new Gson();  
  25.         Student student = new Student();  
  26.         student.setName("xuanyouwu");  
  27.         student.setAge(26);  
  28.         String jsonStr = gson.toJson(student);  
  29.         log("---->javabean convert jsonStr:" + jsonStr);  
  30.     }  
  31.   
  32. }  

运行结果:

---->javabean convert jsonStr:{"name":"xuanyouwu","age":26}

 

 

 

    List Map转Json字符串

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. package com.xuan.gson;  
  2.   
  3. import com.google.gson.Gson;  
  4.   
  5. import java.util.Arrays;  
  6. import java.util.HashMap;  
  7. import java.util.List;  
  8. import java.util.Map;  
  9.   
  10. /** 
  11.  * @author xuanyouwu 
  12.  * @email [email protected] 
  13.  * @time 2016-05-18 10:39 
  14.  */  
  15. public class GsonTest1 {  
  16.   
  17.     private static void log(String msg) {  
  18.         System.out.println(msg);  
  19.     }  
  20.   
  21.   
  22.     public static void main(String[] args) throws Exception {  
  23.         Gson gson = new Gson();  
  24.   
  25.         List<String> list = Arrays.asList("1", "a", "3", "rt", "5");  
  26.         log("---->list convert jsonStr:" + gson.toJson(list));  
  27.   
  28.         Map<String, Object> content = new HashMap<String, Object>();  
  29.         content.put("name", "xuanyouwu");  
  30.         content.put("age", "26");  
  31.         log("---->map convert jsonStr:" + gson.toJson(content));  
  32.     }  
  33.   
  34. }  

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. 运行结果:  

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. ---->list convert jsonStr:["1","a","3","rt","5"]  
  2. ---->map convert jsonStr:{"name":"xuanyouwu","age":"26"}  

 

       Json字符串转JavaBean

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. String studentJsonStr="{\"name\":\"xuanyouwu\",\"age\":26}";  
  2.   
  3. Student student1 = gson.fromJson(studentJsonStr, Student.class);  
  4. log("------->json convert JavaBean:"+student1);  


      运行结果:

            ------->json convert JavaBean:Student{name='xuanyouwu', age=26}

 

 

   Json字符串转List

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. String listJsonStr="[\"1\",\"a\",\"3\",\"rt\",\"5\"]";  

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. Type type = new TypeToken<ArrayList<String>>() {  
  2. }.getType();  
  3. ArrayList<String> sList=gson.fromJson(listJsonStr, type);  
  4. log("------->json convert List:"+sList);  

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. 运行结果:  

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. ------->json convert List:[1, a, 3, rt, 5]  

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. </pre><pre code_snippet_id="1687762" snippet_file_name="blog_20160518_11_939636" name="code" class="java">  Gson封装的类型体系  

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1.    Gson里面有一个非常有意思的抽象基类JsonElement,他的继承体系:  

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. <img src="https://img-blog.csdn.net/20160518135136864?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />  

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1.  JsonObject等同于org的JSONObject,JsonArray也类似,  

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. JsonNull 其实就是null 字段  

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. JsonNull jsonNull=new JsonNull();//构造方法过时,推荐INSTANCE  

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. JsonNull jsonNull=JsonNull.INSTANCE;  
  2.   log("-----"+jsonNull);  

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. 运行结果:  

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. -----null  

     JsonPrimitive非常有意思,我们知道如果json转换成字符串 可能包含引号的转义,但是通过JsonPrimative我们可以获得为转义的字符串,看实例:

     

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. package com.xuan.gson;  
  2.   
  3. import com.google.gson.JsonNull;  
  4. import com.google.gson.JsonPrimitive;  
  5.   
  6. /** 
  7.  * @author xuanyouwu 
  8.  * @email [email protected] 
  9.  * @time 2016-05-18 11:20 
  10.  */  
  11. public class GsonTest2 {  
  12.     private static void log(String msg) {  
  13.         System.out.println(msg);  
  14.     }  
  15.     public static void main(String[] args) throws Exception {  
  16.         String studentJsonStr="{\"name\":\"xuanyouwu\",\"age\":26}";  
  17.         log("------>studentJsonStr:"+studentJsonStr);  
  18.         JsonPrimitive jsonPrimitive=new JsonPrimitive(studentJsonStr);  
  19.         log("------>jsonPrimitive:"+jsonPrimitive);  
  20.         log("------>jsonPrimitive:"+jsonPrimitive.toString());  
  21.         log("------>jsonPrimitive:"+jsonPrimitive.getAsString());  
  22.   
  23.         JsonPrimitive jsonPrimitive2=new JsonPrimitive("this is String");  
  24.         log("------>jsonPrimitive2:"+jsonPrimitive2);  
  25.         log("------>jsonPrimitive2:"+jsonPrimitive2.toString());  
  26.         log("------>jsonPrimitive2:"+jsonPrimitive2.getAsString());  
  27.     }  
  28. }  

     运行结果:

------>studentJsonStr:{"name":"xuanyouwu","age":26}
------>jsonPrimitive:"{\"name\":\"xuanyouwu\",\"age\":26}"
------>jsonPrimitive:"{\"name\":\"xuanyouwu\",\"age\":26}"
------>jsonPrimitive:{"name":"xuanyouwu","age":26}
------>jsonPrimitive2:"this is String"
------>jsonPrimitive2:"this is String"
------>jsonPrimitive2:this is String

 

 

       创建JsonObject

           通过addPropert(key,value)可以向jsonObject中添加字段 跟hashMap类似

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. JsonObject jsonObject=new JsonObject();  
  2. jsonObject.addProperty("name","xuanyouwu");  
  3. jsonObject.addProperty("age",26);  
  4. log("------>create jsonObject:"+jsonObject);  

            运行结果:

                ------>create jsonObject:{"name":"xuanyouwu","age":26}

 

 

    创建JsonArray       

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. JsonArray jsonElements=new JsonArray();  
  2.    jsonElements.add("a");  
  3.    jsonElements.add("b");  
  4.    jsonElements.add("c");  
  5.    jsonElements.add("d");  
  6.    log("------>create jsonArray:"+jsonElements);  

          运行结果:

          ------>create jsonArray:["a","b","c","d"]

 

 

     JsonObject 嵌套数组或者说嵌套JsonArray

           通过JsonObject的add(key,JsonElement)可以为jsonObject 添加一个数组的字段

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. JsonObject jsonObject2=new JsonObject();  
  2. jsonObject2.addProperty("name","xuanyouwu");  
  3. jsonObject2.addProperty("age",26);  
  4. JsonArray jsonElements2=new JsonArray();  
  5. jsonElements2.add("骑车");  
  6. jsonElements2.add("打游戏");  
  7. jsonElements2.add("看电视");  
  8. jsonObject2.add("hobby",jsonElements2);  
  9. log("------>create jsonObject inner JsonArray:"+jsonObject2);  

           运行结果:

            ------>create jsonObject inner JsonArray:{"name":"xuanyouwu","age":26,"hobby":["骑车","打游戏","看电视"]}

 

 

 

Gson注解

          在Gson中有五类注解

          

 

 

 

          重命名注解:SerializedName 

             作用:转换关键字key,json转换成JavaBean时,json字段的key 默认必须和我们声明类的字段名称一样,当服务器端返回了关键字怎么办,比如key 为new switch这样,我们    在声明类的时候不能写这样的字段,可能你想服务器端改动,他可能要改数据库,但是我告诉你,做服务端的大部分不愿意改动他的json,是很自私的!这时候重命名注解都排上用场了   第二种场景:服务器端返回的json 的key 简直太丑,或者太长,你想简化,my_parent_name,可以简化成mpn 比较优雅简介

          实例:

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. package com.xuan.gson;  
  2.   
  3. import com.google.gson.Gson;  
  4. import com.google.gson.annotations.SerializedName;  
  5.   
  6. /** 
  7.  * @author xuanyouwu 
  8.  * @email [email protected] 
  9.  * @time 2016-05-18 11:20 
  10.  */  
  11. public class GsonTest3 {  
  12.     private static void log(String msg) {  
  13.         System.out.println(msg);  
  14.     }  
  15.   
  16.     public static class User {  
  17.         public String name;  
  18.         public int age;  
  19.         @SerializedName("new")  
  20.         public int isnew;  
  21.   
  22.         @Override  
  23.         public String toString() {  
  24.             return "User{" +  
  25.                     "name='" + name + '\'' +  
  26.                     ", age=" + age +  
  27.                     ", isnew=" + isnew +  
  28.                     '}';  
  29.         }  
  30.     }  
  31.   
  32.     public static void main(String[] args) throws Exception {  
  33.   
  34.         String jsonFromServer = "{\n" +  
  35.                 "    \"age\": 26,\n" +  
  36.                 "    \"name\": \"zhangsan\",\n" +  
  37.                 "    \"new\": 1\n" +  
  38.                 "}";  
  39.         Gson gson = new Gson();  
  40.         User user = gson.fromJson(jsonFromServer, User.class);  
  41.         log("------>user:" + user);  
  42.     }  
  43. }  

运行结果: ------>user:User{name='zhangsan', age=26, isnew=1}

 

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. package com.xuan.gson;  
  2.   
  3. import com.google.gson.Gson;  
  4. import com.google.gson.annotations.SerializedName;  
  5.   
  6. /** 
  7.  * @author xuanyouwu 
  8.  * @email [email protected] 
  9.  * @time 2016-05-18 11:20 
  10.  */  
  11. public class GsonTest3 {  
  12.     private static void log(String msg) {  
  13.         System.out.println(msg);  
  14.     }  
  15.   
  16.     public static class User2 {  
  17.         public String name;  
  18.         public int age;  
  19.         @SerializedName("my_parent_name")  
  20.         public String pn;  
  21.   
  22.         @Override  
  23.         public String toString() {  
  24.             return "User2{" +  
  25.                     "name='" + name + '\'' +  
  26.                     ", age=" + age +  
  27.                     ", pn='" + pn + '\'' +  
  28.                     '}';  
  29.         }  
  30.     }  
  31.   
  32.     public static void main(String[] args) throws Exception {  
  33.         String jsonFromServer2="{\n" +  
  34.                 "    \"age\": 26,\n" +  
  35.                 "    \"my_parent_name\": \"zhangsanf\",\n" +  
  36.                 "    \"name\": \"zhangsan\"\n" +  
  37.                 "}";  
  38.         Gson gson2 = new Gson();  
  39.         User2 user2 = gson2.fromJson(jsonFromServer2, User2.class);  
  40.         log("------>user2:" + user2);  
  41.     }  
  42. }  

 

运行结果: ------>user2:User2{name='zhangsan', age=26, pn='zhangsanf'}

 

        作用2:结合alternate 提供多种备用字段key来解析,@SerializedName(value ="desc",alternate = { "other","note"})  如果json中有other就会解析成desc 如果有note也会解析成desc,注意1:value中的值不能出现在alternate中,注意2:alternate的备选字段 会后面的替换前面的

   实例:

   

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. package com.xuan.gson;  
  2.   
  3. import com.google.gson.Gson;  
  4. import com.google.gson.annotations.SerializedName;  
  5.   
  6. /** 
  7.  * @author xuanyouwu 
  8.  * @email [email protected] 
  9.  * @time 2016-05-18 11:20 
  10.  */  
  11. public class GsonTest4 {  
  12.     private static void log(String msg) {  
  13.         System.out.println(msg);  
  14.     }  
  15.   
  16.     public static class User {  
  17.         public String name;  
  18.         public int age;  
  19.         @SerializedName(value = "desc",alternate = {"other","note"})  
  20.         public String desc;  
  21.   
  22.         @Override  
  23.         public String toString() {  
  24.             return "User{" +  
  25.                     "name='" + name + '\'' +  
  26.                     ", age=" + age +  
  27.                     ", desc='" + desc + '\'' +  
  28.                     '}';  
  29.         }  
  30.     }  
  31.   
  32.     public static void main(String[] args) throws Exception {  
  33.         String jsonFromServer = "{\n" +  
  34.                 "    \"age\": 26,\n" +  
  35.                 "    \"other\": \"成都人\",\n" +  
  36.                 "    \"name\": \"zhangsan\"\n" +  
  37.                 "}";  
  38.         Gson gson = new Gson();  
  39.         User user = gson.fromJson(jsonFromServer, User.class);  
  40.         log("------>user:" + user);  
  41.   
  42.   
  43.         String jsonFromServer2 = "{\n" +  
  44.                 "    \"age\": 26,\n" +  
  45.                 "    \"note\": \"成都人\",\n" +  
  46.                 "    \"name\": \"zhangsan\"\n" +  
  47.                 "}";  
  48.         User user2 = gson.fromJson(jsonFromServer2, User.class);  
  49.         log("------>user:" + user2);  
  50.   
  51.         //包括desc 与note note在desc之后  
  52.         String jsonFromServer3="{\n" +  
  53.                 "    \"age\": 26,\n" +  
  54.                 "    \"desc\": \"desc成都人\",\n" +  
  55.                 "    \"name\": \"zhangsan\",\n" +  
  56.                 "    \"note\": \"note成都人\"\n" +  
  57.                 "}";  
  58.         User user3 = gson.fromJson(jsonFromServer3, User.class);  
  59.         log("------>user:" + user3);  
  60.   
  61.         //包括desc 与note note在desc之前  
  62.         String jsonFromServer4="{\n" +  
  63.                 "    \"age\": 26,\n" +  
  64.                 "    \"note\": \"note成都人\",\n" +  
  65.                 "    \"name\": \"zhangsan\",\n" +  
  66.                 "    \"desc\": \"desc成都人\"\n" +  
  67.                 "}";  
  68.         User user4 = gson.fromJson(jsonFromServer4, User.class);  
  69.         log("------>user:" + user4);  
  70.     }  
  71. }  

  运行结果:

     ------>user:User{name='zhangsan', age=26, desc='成都人'}
------>user:User{name='zhangsan', age=26, desc='成都人'}
------>user:User{name='zhangsan', age=26, desc='note成都人'}
------>user:User{name='zhangsan', age=26, desc='desc成都人'}

 

 

  Gson @Expose过滤注解 

 

  源码:默认既可以序列化又可以反序列化

 

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. @Retention(RetentionPolicy.RUNTIME)  
  2. @Target(ElementType.FIELD)  
  3. public @interface Expose {  
  4.     
  5.   public boolean serialize() default true;  
  6.   
  7.   public boolean deserialize() default true;  
  8. }  

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. </pre><pre code_snippet_id="1687762" snippet_file_name="blog_20160518_25_4965554" name="code" class="java">可以排除不需要序列化的字段,需要配合GsonBuilder使用  

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. <pre style="font-family: 宋体; font-size: 9pt; background-color: rgb(255, 255, 255);"><pre name="code" class="java"> Gson gson = new GsonBuilder()  
  2.                 .excludeFieldsWithoutExposeAnnotation()  
  3.                 .create();  

 

  不添加@Expose注解的字段将不会解析:
   分为以下几种情况:
    1:不添加@Expose注解等同于@Expose(deserialize = false,serialize = false) 不做任何解析
    2:@Expose(deserialize = true,serialize = false) 只解析用用,也就是反序列化可以,序列化不可以
    3:@Expose(deserialize = false,serialize = true) 序列化可以,反序列化不行
    4:@Expose(deserialize = true,serialize = true) 既可以序列化,也可以反序列化
    实例:将分别演示这四种情况
 
 
 
  不添加@Expose注解:等同于@Expose(deserialize = false,serialize = false)
 

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. package com.xuan.gson;  
  2.   
  3. import com.google.gson.Gson;  
  4. import com.google.gson.GsonBuilder;  
  5.   
  6. /** 
  7.  * @author xuanyouwu 
  8.  * @email [email protected] 
  9.  * @time 2016-05-18 11:20 
  10.  */  
  11. public class GsonTest5 {  
  12.     private static void log(String msg) {  
  13.         System.out.println(msg);  
  14.     }  
  15.   
  16.     public static class User {  
  17.         public String name;  
  18.   
  19.         @Override  
  20.         public String toString() {  
  21.             return "User{" +  
  22.                     "name='" + name + '\'' +  
  23.                     '}';  
  24.         }  
  25.     }  
  26.   
  27.     public static void main(String[] args) throws Exception {  
  28.         String jsonFromServer = "{\"name\": \"zhangsan\"}";  
  29.         Gson gson = new GsonBuilder()  
  30.                 .excludeFieldsWithoutExposeAnnotation()  
  31.                 .create();  
  32.         User user = gson.fromJson(jsonFromServer, User.class);  
  33.         log("------>反序列化:" + user);  
  34.   
  35.         User user1 = new User();  
  36.         user1.name = "zhangsan2";  
  37.         String userStr = gson.toJson(user1);  
  38.         log("------>序列化:" + userStr);  
  39.     }  
  40. }  
运行结果:
------>反序列化:User{name='null'}
------>序列化:{}
  添加@Expose注解 
 

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. package com.xuan.gson;  
  2.   
  3. import com.google.gson.Gson;  
  4. import com.google.gson.GsonBuilder;  
  5. import com.google.gson.annotations.Expose;  
  6.   
  7. /** 
  8.  * @author xuanyouwu 
  9.  * @email [email protected] 
  10.  * @time 2016-05-18 11:20 
  11.  */  
  12. public class GsonTest5 {  
  13.     private static void log(String msg) {  
  14.         System.out.println(msg);  
  15.     }  
  16.   
  17.     public static class User {  
  18.         @Expose //等同于 @Expose(deserialize = true,serialize = true)  
  19.         public String name;  
  20.   
  21.         @Override  
  22.         public String toString() {  
  23.             return "User{" +  
  24.                     "name='" + name + '\'' +  
  25.                     '}';  
  26.         }  
  27.     }  
  28.   
  29.     public static void main(String[] args) throws Exception {  
  30.         String jsonFromServer = "{\"name\": \"zhangsan\"}";  
  31.         Gson gson = new GsonBuilder()  
  32.                 .excludeFieldsWithoutExposeAnnotation()  
  33.                 .create();  
  34.         User user = gson.fromJson(jsonFromServer, User.class);  
  35.         log("------>反序列化:" + user);  
  36.   
  37.         User user1 = new User();  
  38.         user1.name = "zhangsan2";  
  39.         String userStr = gson.toJson(user1);  
  40.         log("------>序列化:" + userStr);  
  41.     }  
  42. }  

运行结果:

------>反序列化:User{name='zhangsan'}
------>序列化:{"name":"zhangsan2"}

 

 

@Expose注解 只序列化

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. package com.xuan.gson;  
  2.   
  3. import com.google.gson.Gson;  
  4. import com.google.gson.GsonBuilder;  
  5. import com.google.gson.annotations.Expose;  
  6.   
  7. /** 
  8.  * @author xuanyouwu 
  9.  * @email [email protected] 
  10.  * @time 2016-05-18 11:20 
  11.  */  
  12. public class GsonTest5 {  
  13.     private static void log(String msg) {  
  14.         System.out.println(msg);  
  15.     }  
  16.   
  17.     public static class User {  
  18.         @Expose(deserialize = false,serialize = true)  
  19.         public String name;  
  20.   
  21.         @Override  
  22.         public String toString() {  
  23.             return "User{" +  
  24.                     "name='" + name + '\'' +  
  25.                     '}';  
  26.         }  
  27.     }  
  28.   
  29.     public static void main(String[] args) throws Exception {  
  30.         String jsonFromServer = "{\"name\": \"zhangsan\"}";  
  31.         Gson gson = new GsonBuilder()  
  32.                 .excludeFieldsWithoutExposeAnnotation()  
  33.                 .create();  
  34.         User user = gson.fromJson(jsonFromServer, User.class);  
  35.         log("------>反序列化:" + user);  
  36.   
  37.         User user1 = new User();  
  38.         user1.name = "zhangsan2";  
  39.         String userStr = gson.toJson(user1);  
  40.         log("------>序列化:" + userStr);  
  41.     }  
  42. }  

运行结果:

------>反序列化:User{name='null'}------>序列化:{"name":"zhangsan2"}

 

 

 

      @Expose 只反序列化

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. package com.xuan.gson;  
  2.   
  3. import com.google.gson.Gson;  
  4. import com.google.gson.GsonBuilder;  
  5. import com.google.gson.annotations.Expose;  
  6.   
  7. /** 
  8.  * @author xuanyouwu 
  9.  * @email [email protected] 
  10.  * @time 2016-05-18 11:20 
  11.  */  
  12. public class GsonTest5 {  
  13.     private static void log(String msg) {  
  14.         System.out.println(msg);  
  15.     }  
  16.   
  17.     public static class User {  
  18.         @Expose(deserialize = true, serialize = false)  
  19.         public String name;  
  20.   
  21.         @Override  
  22.         public String toString() {  
  23.             return "User{" +  
  24.                     "name='" + name + '\'' +  
  25.                     '}';  
  26.         }  
  27.     }  
  28.   
  29.     public static void main(String[] args) throws Exception {  
  30.         String jsonFromServer = "{\"name\": \"zhangsan\"}";  
  31.         Gson gson = new GsonBuilder()  
  32.                 .excludeFieldsWithoutExposeAnnotation()  
  33.                 .create();  
  34.         User user = gson.fromJson(jsonFromServer, User.class);  
  35.         log("------>反序列化:" + user);  
  36.   
  37.         User user1 = new User();  
  38.         user1.name = "zhangsan2";  
  39.         String userStr = gson.toJson(user1);  
  40.         log("------>序列化:" + userStr);  
  41.     }  
  42. }  

运行结果:

 ------>反序列化:User{name='zhangsan'}
------>序列化:{}

 

 

    @Since(float v)注解  版本控制 

      结合GsonBuilder.setVersion(n)使用 当n>=v时 才会序列化解析

 

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. package com.xuan.gson;  
  2.   
  3. import com.google.gson.Gson;  
  4. import com.google.gson.GsonBuilder;  
  5. import com.google.gson.annotations.Since;  
  6.   
  7. /** 
  8.  * @author xuanyouwu 
  9.  * @email [email protected] 
  10.  * @time 2016-05-18 11:20 
  11.  */  
  12. public class GsonTest6 {  
  13.     private static void log(String msg) {  
  14.         System.out.println(msg);  
  15.     }  
  16.   
  17.     public static class User {  
  18.         @Since(2)  
  19.         public String name;  
  20.   
  21.         @Override  
  22.         public String toString() {  
  23.             return "User{" +  
  24.                     "name='" + name + '\'' +  
  25.                     '}';  
  26.         }  
  27.     }  
  28.   
  29.     public static void main(String[] args) throws Exception {  
  30.         String jsonFromServer = "{\"name\": \"zhangsan\"}";  
  31.         Gson gson = new GsonBuilder()  
  32.                 .setVersion(1)//版本为1  
  33.                 .create();  
  34.         User user1 = gson.fromJson(jsonFromServer, User.class);  
  35.         log("------>反序列化v=1:" + user1);  
  36.   
  37.         User user1_1 = new User();  
  38.         user1_1.name = "zhangsan2";  
  39.         String userStr = gson.toJson(user1_1);  
  40.         log("------>序列化v=1:" + userStr);  
  41.   
  42.   
  43.         Gson gson2 = new GsonBuilder()  
  44.                 .setVersion(2)//版本为2  
  45.                 .create();  
  46.         User user2 = gson2.fromJson(jsonFromServer, User.class);  
  47.         log("------>反序列化v=2:" + user2);  
  48.   
  49.         User user2_1 = new User();  
  50.         user2_1.name = "zhangsan2";  
  51.         String userStr2_1 = gson2.toJson(user2_1);  
  52.         log("------>序列化v=2:" + userStr2_1);  
  53.   
  54.         Gson gson3 = new GsonBuilder()  
  55.                 .setVersion(3)//版本为3  
  56.                 .create();  
  57.         User user3 = gson3.fromJson(jsonFromServer, User.class);  
  58.         log("------>反序列化v=3:" + user3);  
  59.   
  60.         User user3_1 = new User();  
  61.         user3_1.name = "zhangsan2";  
  62.         String userStr3_1 = gson3.toJson(user3_1);  
  63.         log("------>序列化v=3:" + userStr3_1);  
  64.     }  
  65. }  

运行结果:

------>反序列化v=1:User{name='null'}
------>序列化v=1:{}
------>反序列化v=2:User{name='zhangsan'}
------>序列化v=2:{"name":"zhangsan2"}
------>反序列化v=3:User{name='zhangsan'}
------>序列化v=3:{"name":"zhangsan2"}

 

 

    @Util(float v)注解 版本控制

      当gson的setVersion(n) n<v 才解析

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. package com.xuan.gson;  
  2.   
  3. import com.google.gson.Gson;  
  4. import com.google.gson.GsonBuilder;  
  5. import com.google.gson.annotations.Until;  
  6.   
  7. /** 
  8.  * @author xuanyouwu 
  9.  * @email [email protected] 
  10.  * @time 2016-05-18 11:20 
  11.  */  
  12. public class GsonTest6 {  
  13.     private static void log(String msg) {  
  14.         System.out.println(msg);  
  15.     }  
  16.   
  17.     public static class User {  
  18.         @Until(2)  
  19.         public String name;  
  20.   
  21.         @Override  
  22.         public String toString() {  
  23.             return "User{" +  
  24.                     "name='" + name + '\'' +  
  25.                     '}';  
  26.         }  
  27.     }  
  28.   
  29.     public static void main(String[] args) throws Exception {  
  30.         String jsonFromServer = "{\"name\": \"zhangsan\"}";  
  31.         Gson gson = new GsonBuilder()  
  32.                 .setVersion(1)//版本为1  
  33.                 .create();  
  34.         User user1 = gson.fromJson(jsonFromServer, User.class);  
  35.         log("------>反序列化v=1:" + user1);  
  36.   
  37.         User user1_1 = new User();  
  38.         user1_1.name = "zhangsan2";  
  39.         String userStr = gson.toJson(user1_1);  
  40.         log("------>序列化v=1:" + userStr);  
  41.   
  42.   
  43.         Gson gson2 = new GsonBuilder()  
  44.                 .setVersion(2)//版本为2  
  45.                 .create();  
  46.         User user2 = gson2.fromJson(jsonFromServer, User.class);  
  47.         log("------>反序列化v=2:" + user2);  
  48.   
  49.         User user2_1 = new User();  
  50.         user2_1.name = "zhangsan2";  
  51.         String userStr2_1 = gson2.toJson(user2_1);  
  52.         log("------>序列化v=2:" + userStr2_1);  
  53.   
  54.         Gson gson3 = new GsonBuilder()  
  55.                 .setVersion(3)//版本为3  
  56.                 .create();  
  57.         User user3 = gson3.fromJson(jsonFromServer, User.class);  
  58.         log("------>反序列化v=3:" + user3);  
  59.   
  60.         User user3_1 = new User();  
  61.         user3_1.name = "zhangsan2";  
  62.         String userStr3_1 = gson3.toJson(user3_1);  
  63.         log("------>序列化v=3:" + userStr3_1);  
  64.     }  
  65. }  


运行结果:

------>反序列化v=1:User{name='zhangsan'}
------>序列化v=1:{"name":"zhangsan2"}
------>反序列化v=2:User{name='null'}
------>序列化v=2:{}
------>反序列化v=3:User{name='null'}
------>序列化v=3:{}

 

Gson 高级用法

    相信看过retrofit2.0 源码的同学都知道,其中有一个GsonConverterFactory 里面的用法十分精炼老成,这里来一段源码

 

 

   据说使用TypeAdapter 效率更高,本人还未对比测试,暂时放后吧,TypeAdapter是什么玩意呢?

   在源码中备注了一句 Converts Java objects to and from JSON 就是对象json之间的互相转换 接替了T 泛型类的序列化和反序列化的逻辑

   从源码中我们看到区分了2.1版本之前后之后的用法,2.1版本之前可以自定义adapter:

   

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. public class PointAdapter extends TypeAdapter<Point> {  
  2.  *     public Point read(JsonReader reader) throws IOException {  
  3.  *       if (reader.peek() == JsonToken.NULL) {  
  4.  *         reader.nextNull();  
  5.  *         return null;  
  6.  *       }  
  7.  *       String xy = reader.nextString();  
  8.  *       String[] parts = xy.split(",");  
  9.  *       int x = Integer.parseInt(parts[0]);  
  10.  *       int y = Integer.parseInt(parts[1]);  
  11.  *       return new Point(x, y);  
  12.  *     }  
  13.  *     public void write(JsonWriter writer, Point value) throws IOException {  
  14.  *       if (value == null) {  
  15.  *         writer.nullValue();  
  16.  *         return;  
  17.  *       }  
  18.  *       String xy = value.getX() + "," + value.getY();  
  19.  *       writer.value(xy);  
  20.  *     }  
  21.  *   }}  

 

    使用

  

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. GsonBuilder builder = new GsonBuilder();  
  2.  *   builder.registerTypeAdapter(Point.class, new PointAdapter());  
  3.  *   // if PointAdapter didn't check for nulls in its read/write methods, you should instead use  
  4.  *   // builder.registerTypeAdapter(Point.class, new PointAdapter().nullSafe());  
  5.  *   ...  
  6.  *   Gson gson = builder.create();  

 

    在2.1版本之后更推荐直接插入泛型就使用

 

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. //   String json = "{'origin':'0,0','points':['1,2','3,4']}";  
  2. //   TypeAdapter<Graph> graphAdapter = gson.getAdapter(Graph.class);  
  3. //   Graph graph = graphAdapter.fromJson(json);  
  4. // }</pre>  
  5. // And an example for serialization: <pre>   {@code  
  6. //  
  7. //   Graph graph = new Graph(...);  
  8. //   TypeAdapter<Graph> graphAdapter = gson.getAdapter(Graph.class);  
  9. //   String json = graphAdapter.toJson(graph);  
  10. // }</pre>  
   实例:使用TypeAdapter 来序列化和反序列化
 

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. package com.xuan.gson;  
  2.   
  3. import com.google.gson.Gson;  
  4. import com.google.gson.TypeAdapter;  
  5.   
  6. /** 
  7.  * @author xuanyouwu 
  8.  * @email [email protected] 
  9.  * @time 2016-05-18 11:20 
  10.  */  
  11. public class GsonTest7 {  
  12.     private static void log(String msg) {  
  13.         System.out.println(msg);  
  14.     }  
  15.   
  16.     public static class User {  
  17.         public String name;  
  18.         public int age;  
  19.   
  20.         @Override  
  21.         public String toString() {  
  22.             return "User{" +  
  23.                     "name='" + name + '\'' +  
  24.                     ", age=" + age +  
  25.                     '}';  
  26.         }  
  27.     }  
  28.   
  29.     public static void main(String[] args) throws Exception {  
  30.         Gson gson = new Gson();  
  31.         TypeAdapter<User> userTypeAdapter = gson.getAdapter(User.class);  
  32.         User user = new User();  
  33.         user.name = "xuanyouwu";  
  34.         user.age = 26;  
  35.         String userJsonStr = userTypeAdapter.toJson(user);  
  36.         log("------>序列化:" + userJsonStr);  
  37.   
  38.         User user1 = userTypeAdapter.fromJson(userJsonStr);  
  39.         log("------>反序列化:" + user1);  
  40.   
  41.     }  
  42. }  

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. 运行结果:  

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. ------>序列化:{"name":"xuanyouwu","age":26}  
  2. ------>反序列化:User{name='xuanyouwu', age=26}  
Gson的容错机制:
   为什么要容错了,在javaBean中声明了int类型的age 如果服务端 返回的是"" 空字符串怎么办呢?崩溃?
   如果json格式不规范如 {name=zhangsan,age:26,hobby=null}  发现不是普通的key value
  容错实现方式1:
  1:创建Gson的方式

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. gson = new GsonBuilder()  
  2.                   .setLenient()// json宽松  
  3.                   .create();  

2:使用JsonReader

   JsonReader jsonReader = gson.newJsonReader(value.charStream());

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. jsonReader.<span style="font-family: 宋体; font-size: 9pt;">setLenient(true)</span>  

    3:自定义TypeAdapter

    4:使用注解JsonAdapter,其实也是自定义Adapter

 

 1.2归为一类 由框架实现,基本json大格式规范,键值对不标准,多引号的问题等等,而不报错停止解析,但是功能相对较弱

 能解决bug 

[java] view plain copy

print?

  1. com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON<span style="font-family:宋体; font-size:9pt; background-color:rgb(228,228,255)"> </span>  

3,4归为一类,都属于自定义adapter,但是3与gson绑定,4使用注解和字段绑定

 实例:

   

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. package com.xuan.gson;  
  2.   
  3. import com.google.gson.Gson;  
  4. import com.google.gson.GsonBuilder;  
  5. import com.google.gson.JsonParseException;  
  6. import com.google.gson.TypeAdapter;  
  7. import com.google.gson.stream.JsonReader;  
  8. import com.google.gson.stream.JsonWriter;  
  9.   
  10. import java.io.IOException;  
  11.   
  12. /** 
  13.  * @author xuanyouwu 
  14.  * @email [email protected] 
  15.  * @time 2016-05-18 11:20 
  16.  */  
  17. public class GsonTest8 {  
  18.     private static void log(String msg) {  
  19.         System.out.println(msg);  
  20.     }  
  21.   
  22.     public static class User {  
  23.         public String name;  
  24.         public int age;  
  25.   
  26.         @Override  
  27.         public String toString() {  
  28.             return "User{" +  
  29.                     "name='" + name + '\'' +  
  30.                     ", age=" + age +  
  31.                     '}';  
  32.         }  
  33.   
  34.   
  35.         ;  
  36.     }  
  37.   
  38.     public static class UserTypeAdapter extends TypeAdapter<User> {  
  39.   
  40.         @Override  
  41.         public void write(JsonWriter out, User value) throws IOException {  
  42.             out.beginObject();  
  43.             out.name("name").value(value.name);  
  44.             out.name("age").value(value.age);  
  45.             out.endObject();  
  46.         }  
  47.   
  48.         @Override  
  49.         public User read(JsonReader in) throws IOException {  
  50.             User user = new User();  
  51.             in.beginObject();  
  52.             while (in.hasNext()) {  
  53.                 switch (in.nextName()) {  
  54.                     case "name":  
  55.                         user.name = in.nextString();  
  56.                         break;  
  57.                     case "age":  
  58.                         try {  
  59.                             String str = in.nextString();  
  60.                             user.age = Integer.valueOf(str);  
  61.                         } catch (Exception e) {  
  62.                         }  
  63.                         break;  
  64.                 }  
  65.             }  
  66.             in.endObject();  
  67.             return user;  
  68.         }  
  69.     }  
  70.   
  71.     public static void main(String[] args) throws Exception {  
  72.         Gson gson = new Gson();  
  73.   
  74.         String jsonStrFromServer = "{\n" +  
  75.                 "    \"age\": \"\",\n" +  
  76.                 "    \"name\": \"zhangsan\"\n" +  
  77.                 "}";  
  78.         log("------->jsonFromServer:"+jsonStrFromServer);  
  79.         try {  
  80.             User user = gson.fromJson(jsonStrFromServer, User.class);  
  81.             log("------>默认Gson 解析:" + user);  
  82.         } catch (JsonParseException e) {//java.lang.NumberFormatException: empty String  
  83.             log("------>默认Gson 解析 异常:" + e);  
  84.         }  
  85.   
  86.         Gson gson2 = new GsonBuilder()  
  87.                 .registerTypeAdapter(User.class, new UserTypeAdapter()).create();  
  88.         try {  
  89.             User user2 = gson2.fromJson(jsonStrFromServer, User.class);  
  90.             log("------>自定义adapter 解析:" + user2);  
  91.         } catch (JsonParseException e) {//java.lang.NumberFormatException: empty String  
  92.             log("------>自定义adapter 异常:" + e);  
  93.         }  
  94.   
  95.         try {  
  96.             UserTypeAdapter userTypeAdapter = new UserTypeAdapter();  
  97.             User user3 = userTypeAdapter.fromJson(jsonStrFromServer);  
  98.             log("------>自定义adapter 解析2:" + user3);  
  99.         } catch (Exception e) {  
  100.             log("------>自定义adapter 异常2:" + e);  
  101.         }  
  102.     }  
  103. }  

运行结果:

------->jsonFromServer:{
    "age": "",
    "name": "zhangsan"
}
------>默认Gson 解析 异常:com.google.gson.JsonSyntaxException: java.lang.NumberFormatException: empty String
------>自定义adapter 解析:User{name='zhangsan', age=0}
------>自定义adapter 解析2:User{name='zhangsan', age=0}

可以看到 age是空字符串 但是不影响整体的解析流程,这对客户端是十分友好的

 

  基于注解的方式,上面的方式倾向于整体,注解的方式倾向于字段

  

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. package com.xuan.gson;  
  2.   
  3. import com.google.gson.Gson;  
  4. import com.google.gson.JsonParseException;  
  5. import com.google.gson.TypeAdapter;  
  6. import com.google.gson.annotations.JsonAdapter;  
  7. import com.google.gson.stream.JsonReader;  
  8. import com.google.gson.stream.JsonWriter;  
  9.   
  10. import java.io.IOException;  
  11.   
  12. /** 
  13.  * @author xuanyouwu 
  14.  * @email [email protected] 
  15.  * @time 2016-05-18 11:20 
  16.  */  
  17. public class GsonTest9 {  
  18.     private static void log(String msg) {  
  19.         System.out.println(msg);  
  20.     }  
  21.   
  22.     public static class User {  
  23.         public String name;  
  24.         @JsonAdapter(IntegerTypeAdapter.class)  
  25.         public int age;  
  26.   
  27.         @Override  
  28.         public String toString() {  
  29.             return "User{" +  
  30.                     "name='" + name + '\'' +  
  31.                     ", age=" + age +  
  32.                     '}';  
  33.         }  
  34.     }  
  35.   
  36.     public static class IntegerTypeAdapter extends TypeAdapter<Integer> {  
  37.   
  38.         @Override  
  39.         public void write(JsonWriter out, Integer value) throws IOException {  
  40.             out.value(value);  
  41.         }  
  42.   
  43.         @Override  
  44.         public Integer read(JsonReader in) throws IOException {  
  45.             int i = 0;  
  46.             try {  
  47.                 String str = in.nextString();  
  48.                 i = Integer.valueOf(str);  
  49.             } catch (Exception e) {  
  50.             }  
  51.             return i;  
  52.         }  
  53.     }  
  54.   
  55.     public static class User2 {  
  56.         public String name;  
  57.         public int age;  
  58.   
  59.         @Override  
  60.         public String toString() {  
  61.             return "User{" +  
  62.                     "name='" + name + '\'' +  
  63.                     ", age=" + age +  
  64.                     '}';  
  65.         }  
  66.     }  
  67.   
  68.   
  69.     public static void main(String[] args) throws Exception {  
  70.         Gson gson = new Gson();  
  71.   
  72.         String jsonStrFromServer = "{\n" +  
  73.                 "    \"age\": \"\",\n" +  
  74.                 "    \"name\": \"zhangsan\"\n" +  
  75.                 "}";  
  76.         log("------->jsonFromServer:" + jsonStrFromServer);  
  77.         try {  
  78.             User2 user2 = gson.fromJson(jsonStrFromServer, User2.class);  
  79.             log("------>gson 解析:" + user2);  
  80.         } catch (Exception e) {  
  81.             log("------>gson 解析异常:" + e);  
  82.         }  
  83.   
  84.   
  85.         try {  
  86.             User user = gson.fromJson(jsonStrFromServer, User.class);  
  87.             log("------>JsonAdapter 注解 解析:" + user);  
  88.         } catch (JsonParseException e) {//java.lang.NumberFormatException: empty String  
  89.             log("------>JsonAdapter 注解 异常:" + e);  
  90.         }  
  91.     }  
  92. }  

 

运行结果:

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. ------->jsonFromServer:{  
  2.     "age": "",  
  3.     "name": "zhangsan"  
  4. }  
  5. ------>gson 解析异常:com.google.gson.JsonSyntaxException: java.lang.NumberFormatException: empty String  
  6. ------>JsonAdapter 注解 解析:User{name='zhangsan', age=0}  

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. 可以看到我们成功地跳过服务端返回json不合理的坑了吧  

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. </pre><pre code_snippet_id="1687762" snippet_file_name="blog_20160519_47_1535429" name="code" class="java">不得不吐槽啊,像这种服务器端错误,应该完全归结服务端json不合理返回,  

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. 往往老板都会找客户端原因,怎么又崩溃了?怎么又不显示了?老板不会关心是不是数据返回不合理的问题的!  

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. 做客户端需要相当的承受能力哈,同意的点个赞哈  

[java] view plain copy

print?在CODE上查看代码片派生到我的代码片

  1. </pre><p>其实上面的方式保险是很保险,但是需要维护的地方多,代码量大,我们介绍另外一种方式:JsonSerializer与JsonDeserializer 之关系单方面的处理,可以全局注册某个类型的处理:看实例:</p><p><pre name="code" class="java">package com.xuan.gson;  
  2.   
  3. import com.google.gson.Gson;  
  4. import com.google.gson.GsonBuilder;  
  5. import com.google.gson.JsonDeserializationContext;  
  6. import com.google.gson.JsonDeserializer;  
  7. import com.google.gson.JsonElement;  
  8. import com.google.gson.JsonParseException;  
  9.   
  10. import java.lang.reflect.Type;  
  11.   
  12. /** 
  13.  * @author xuanyouwu 
  14.  * @email [email protected] 
  15.  * @time 2016-05-18 11:20 
  16.  */  
  17. public class GsonTest10 {  
  18.     private static void log(String msg) {  
  19.         System.out.println(msg);  
  20.     }  
  21.   
  22.     public static class User {  
  23.         public String name;  
  24.         public int age;  
  25.   
  26.         @Override  
  27.         public String toString() {  
  28.             return "User{" +  
  29.                     "name='" + name + '\'' +  
  30.                     ", age=" + age +  
  31.                     '}';  
  32.         }  
  33.     }  
  34.   
  35.   
  36.     public static void main(String[] args) throws Exception {  
  37.         JsonDeserializer<Integer> jsonDeserializer = new JsonDeserializer<Integer>() {  
  38.             @Override  
  39.             public Integer deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {  
  40.                 try {  
  41.                     return json.getAsInt();  
  42.                 } catch (NumberFormatException e) {  
  43.                     return 0;  
  44.                 }  
  45.             }  
  46.         };  
  47.         Gson gson = new GsonBuilder()  
  48.                 .registerTypeAdapter(int.class, jsonDeserializer)  
  49.                 .create();  
  50.   
  51.         String jsonStrFromServer = "{\n" +  
  52.                 "    \"age\": \"\",\n" +  
  53.                 "    \"name\": \"zhangsan\"\n" +  
  54.                 "}";  
  55.         log("------->jsonFromServer:" + jsonStrFromServer);  
  56.         try {  
  57.             User user = gson.fromJson(jsonStrFromServer, User.class);  
  58.             log("------>  JsonDeserializer<Integer> 解析:" + user);  
  59.         } catch (Exception e) {  
  60.             log("------>  JsonDeserializer<Integer> 解析异常:" + e);  
  61.         }  
  62.   
  63.         Gson gson1=new Gson();  
  64.         try {  
  65.             User user1 = gson1.fromJson(jsonStrFromServer, User.class);  
  66.             log("------> 默认gson 解析:" + user1);  
  67.         } catch (Exception e) {  
  68.             log("------>  默认gson 解析异常:" + e);  
  69.         }  
  70.   
  71.   
  72.     }  
  73. }  

运行结果:

------->jsonFromServer:{
    "age": "",
    "name": "zhangsan"
}
------>  JsonDeserializer<Integer> 解析:User{name='zhangsan', age=0}
------>  默认gson 解析异常:com.google.gson.JsonSyntaxException: java.lang.NumberFormatException: empty String

 这样定义全局的反序列化工具就能避免解析异常

保存下来 ,用作学习,不到之处,还望各位大佬指正

转载:https://blog.csdn.net/sinat_34093604/article/details/53158059

博主:吃奶的牛

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/csdn_liumh/article/details/82893908

智能推荐

oracle 12c 集群安装后的检查_12c查看crs状态-程序员宅基地

文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态

解决jupyter notebook无法找到虚拟环境的问题_jupyter没有pytorch环境-程序员宅基地

文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境

国内安装scoop的保姆教程_scoop-cn-程序员宅基地

文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn

Element ui colorpicker在Vue中的使用_vue el-color-picker-程序员宅基地

文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker

迅为iTOP-4412精英版之烧写内核移植后的镜像_exynos 4412 刷机-程序员宅基地

文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机

Linux系统配置jdk_linux配置jdk-程序员宅基地

文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk

随便推点

matlab(4):特殊符号的输入_matlab微米怎么输入-程序员宅基地

文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入

C语言程序设计-文件(打开与关闭、顺序、二进制读写)-程序员宅基地

文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。‍ Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。

Touchdesigner自学笔记之三_touchdesigner怎么让一个模型跟着鼠标移动-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动

【附源码】基于java的校园停车场管理系统的设计与实现61m0e9计算机毕设SSM_基于java技术的停车场管理系统实现与设计-程序员宅基地

文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计

Android系统播放器MediaPlayer源码分析_android多媒体播放源码分析 时序图-程序员宅基地

文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;amp;gt;Jni-&amp;amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图

java 数据结构与算法 ——快速排序法-程序员宅基地

文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法