Gson 操作

  • bean、list 和gson转换
/**
 * 测试类
 * Created by hyman on 2017/5/22.
 */
public class StudentTest {

    public static void main(String[] args) {
        Gson gson = new Gson();

        Student student1 = new Student();
        student1.setId("101");
        student1.setUserName("hyman");
        student1.setBirthday(new Date());


        System.out.println("---------简单java对象的转换");
        String s1 = gson.toJson(student1);
        //bean--->json
        System.out.println("简单Bean转换Gson==" + s1);
        //json--->bean
        Student student = gson.fromJson(s1, Student.class);
        System.out.println("josn转换为bean==" + student);

        Student student2 = new Student();
        student2.setId("102");
        student2.setUserName("hyq");
        student2.setBirthday(new Date());

        Student student3 = new Student();
        student3.setId("103");
        student3.setUserName("LiSi");
        student3.setBirthday(new Date());

        List<Student> list = new ArrayList<Student>();
        list.add(student1);
        list.add(student2);
        list.add(student3);
        //list转化为json
        System.out.println("--------带泛型的list之间的转化-----------");
        String s2 = gson.toJson(list);
        System.out.println("带泛型的list转化为json==" + s2);

        //json转化为带泛型的list
        List<Student> retList =
                gson.fromJson(s2,new TypeToken<List<Student>>(){}.getType());
        for(Student stu:retList){
            System.out.println(stu);
        }

    }

}
  • io流 与Gson转化
try(Writer writer = new OutputStreamWriter(new FileOutputStream("Output.json") , "UTF-8")){
            Gson gson = new GsonBuilder().create();
            gson.toJson("Hello", writer);
            gson.toJson(123, writer);
        }
public static void main(String[] args) throws IOException {
        try(Reader reader = new InputStreamReader(JsonToJava.class.getResourceAsStream("/Server1.json"), "UTF-8")){
            Gson gson = new GsonBuilder().create();
            Person p = gson.fromJson(reader, Person.class);
            System.out.println(p);
        }
    }
  • List Map转Json字符串
 public static void main(String[] args) throws Exception {  
        Gson gson = new Gson();  

        List<String> list = Arrays.asList("1", "a", "3", "rt", "5");  
        log("---->list convert jsonStr:" + gson.toJson(list));  

        Map<String, Object> content = new HashMap<String, Object>();  
        content.put("name", "xuanyouwu");  
        content.put("age", "26");  
        log("---->map convert jsonStr:" + gson.toJson(content));  
    }  

public class GsonTest2 {  
    private static void log(String msg) {  
        System.out.println(msg);  
    }  
    public static void main(String[] args) throws Exception {  
        String studentJsonStr="{\"name\":\"xuanyouwu\",\"age\":26}";  
        log("------>studentJsonStr:"+studentJsonStr);  
        JsonPrimitive jsonPrimitive=new JsonPrimitive(studentJsonStr);  
        log("------>jsonPrimitive:"+jsonPrimitive);  
        log("------>jsonPrimitive:"+jsonPrimitive.toString());  
        log("------>jsonPrimitive:"+jsonPrimitive.getAsString());  

        JsonPrimitive jsonPrimitive2=new JsonPrimitive("this is String");  
        log("------>jsonPrimitive2:"+jsonPrimitive2);  
        log("------>jsonPrimitive2:"+jsonPrimitive2.toString());  
        log("------>jsonPrimitive2:"+jsonPrimitive2.getAsString());  
    }  

Gson注释

  • 1.1@SerializedName注解
    • 该注解能指定该字段在JSON中对应的字段名称
public class Box {

  @SerializedName("w")
  private int width;

  @SerializedName("h")
  private int height;

  @SerializedName("d")
  private int depth;

  // Methods removed for brevity
}
  • 2.@Expose注解
    • 该注解能够指定该字段是否能够序列化或者反序列化,默认的是都支持(true)。
public class Account {

  @Expose(deserialize = false)
  private String accountNumber;

  @Expose
  private String iban;

  @Expose(serialize = false)
  private String owner;

  @Expose(serialize = false, deserialize = false)
  private String address;

  private String pin;
}
  • 需要注意的通过 builder.excludeFieldsWithoutExposeAnnotation()方法是该注解生效。
  final GsonBuilder builder = new GsonBuilder();
    builder.excludeFieldsWithoutExposeAnnotation();
    final Gson gson = builder.create();
  • 3.@Since和@Until注解
    • Since代表“自从”,Until 代表”一直到”。它们都是针对该字段生效的版本。比如说 @Since(1.2)代表从版本1.2之后才生效,@Until(0.9)代表着在0.9版本之前都是生效的。
public class SoccerPlayer {

  private String name;

  @Since(1.2)
  private int shirtNumber;

  @Until(0.9)
  private String country;

  private String teamName;

  // Methods removed for brevity
}

Gson 序列化

  • 1 序列化方案1
    • 采用上面提到的@SerializedName注解。
public class Book {
  private String[] authors;

  @SerializedName("isbn-10")
  private String isbn10;

  @SerializedName("isbn-13")
  private String isbn13;
  private String title;
  //为了代码简洁,这里移除getter和setter方法等

}
    1. 序列化方案2
      • 利用JsonSerializer类
public class BookSerialiser implements JsonSerializer {

    @Override
    public JsonElement serialize(final Book book, final Type typeOfSrc, final JsonSerializationContext context) {

        final JsonObject jsonObject = new JsonObject();
        jsonObject.addProperty("title", book.getTitle());
        jsonObject.addProperty("isbn-10", book.getIsbn10());
        jsonObject.addProperty("isbn-13", book.getIsbn13());

        final JsonArray jsonAuthorsArray = new JsonArray();
        for (final String author : book.getAuthors()) {
            final JsonPrimitive jsonAuthor = new JsonPrimitive(author);
            jsonAuthorsArray.add(jsonAuthor);
        }
        jsonObject.add("authors", jsonAuthorsArray);

        return jsonObject;
    }
}
  • JsonSerializer是一个接口,我们需要提供自己的
public interface JsonSerializer<T> {

/**
 *Gson 会在解析指定类型T数据的时候触发当前回调方法进行序列化
 *
 * @param T 需要转化为Json数据的类型,对应上面的Book
 * @return 返回T指定的类对应JsonElement
 */
public JsonElement serialize(T src, Type typeOfSrc, JsonSerializationContext context);
}
  • 首先在上面的代码中,我们需要创建的是一个JsonElement对象,这里对应Book是一个对象,所以创建一个JsonObject类型。
final JsonObject jsonObject = new JsonObject();
  • 然后我们将相应字段里面的数据填充到jsonObject里面。
jsonObject.addProperty...
jsonObject.add...
  • 所以最后返回的还是一个JsonElement 类型,这里对应的是jsonObject。完成了javaBean->JSON数据的转化。
  • 同样需要配置,
// Configure GSON
  final GsonBuilder gsonBuilder = new GsonBuilder();
  gsonBuilder.registerTypeAdapter(Book.class, new BookSerialiser());
  gsonBuilder.setPrettyPrinting();
  final Gson gson = gsonBuilder.create();

  final Book javaPuzzlers = new Book();
  javaPuzzlers.setTitle("Java Puzzlers: Traps, Pitfalls, and Corner Cases");
  javaPuzzlers.setIsbn10("032133678X");
  javaPuzzlers.setIsbn13("978-0321336781");
  javaPuzzlers.setAuthors(new String[] { "Joshua Bloch", "Neal Gafter" });

  // Format to JSON
  final String json = gson.toJson(javaPuzzlers);
  System.out.println(json);
  • 这里对应的是gsonBuilder.registerTypeAdapter(Book.class, new BookSerialiser())方法进行JsonSerializer的配置。在上面例子中,通过调用gsonBuilder.setPrettyPrinting();方法还告诉了 Gson 对生成的 JSON 对象进行格式化

Gson 反序列化

  • 1 反序列化方案1
    • 利用@SerializedName 注解
    • 也就是说我们的实体类Book.java可以这么写:
public class Book {
  private String[] authors;

  @SerializedName("isbn-10")
  private String isbn10;

  @SerializedName(value = "isbn-13", alternate = {"isbn13","isbn.13"})
  private String isbn13;
  private String title;
  //为了代码简洁,这里移除getter和setter方法等

}

可以看到这里我们在@SerializedName 注解使用了一个value, alternate字段,value也就是默认的字段,对序列化和反序列化都有效,alternate只有反序列化才有效果。也就是说一般服务器返回给我们JSON数据的时候可能同样的一个图片,表示”image”,”img”,”icon”等,我们利用@SerializedName 中的alternate字段就能解决这个问题,全部转化为我们实体类中的图片字段。
- 2 反序列化方案2
- 我们在序列化的时候使用的是JsonSerialize ,这里对应使用JsonDeserializer
- 我们将解析到的json数据传递给Book的setter方法即可。

public class BookDeserializer implements JsonDeserializer<Book> {

  @Override
  public Book deserialize(final JsonElement json, final Type typeOfT, final JsonDeserializationContext context)
      throws JsonParseException {
    final JsonObject jsonObject = json.getAsJsonObject();

    final JsonElement jsonTitle = jsonObject.get("title");
    final String title = jsonTitle.getAsString();

    final String isbn10 = jsonObject.get("isbn-10").getAsString();
    final String isbn13 = jsonObject.get("isbn-13").getAsString();

    final JsonArray jsonAuthorsArray = jsonObject.get("authors").getAsJsonArray();
    final String[] authors = new String[jsonAuthorsArray.size()];
    for (int i = 0; i < authors.length; i++) {
      final JsonElement jsonAuthor = jsonAuthorsArray.get(i);
      authors[i] = jsonAuthor.getAsString();
    }

    final Book book = new Book();
    book.setTitle(title);
    book.setIsbn10(isbn10);
    book.setIsbn13(isbn13);
    book.setAuthors(authors);
    return book;
  }
}
  • 和Gson序列化章节一样,我们这里接着分析我们是怎么将JSON数据解析(反序列化)为实体类的:
    • 因为我们可以发现上面的JSON数据是一个{}大括号包围的,也就意味着这是一个Json对象。所以首先我们通过final JsonObject jsonObject = json.getAsJsonObject();将我们的JsonElement转化为JsonObject
    • 通过jsonObject.get("xxx").getAsString()的形式获取相应String的值
    • 通过jsonObject.get("xx").getAsJsonArray();获取相应的json数组,并遍历出其中的相应字段值
    • 通过setter方法,将获取到的值设置给Book类。
    • 最终返回的是 Book的对象实例。完成了JSON->javaBean的转化同样需要配置
    • 关于从本地流中读取Json数据可以使用 InputStreamReader完成
// Configure Gson
  GsonBuilder gsonBuilder = new GsonBuilder();
  gsonBuilder.registerTypeAdapter(Book.class, new BookDeserializer());
  Gson gson = gsonBuilder.create();

  // The JSON data
  try(Reader reader = new InputStreamReader(Main.class.getResourceAsStream("/part1/sample.json"), "UTF-8")){

    // Parse JSON to Java
    Book book = gson.fromJson(reader, Book.class);
    System.out.println(book);
  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要在 Maven 项目中使用 Gson 库,需要在 pom.xml 文件中添加以下依赖项: ```xml <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.7</version> </dependency> ``` 添加依赖项后,Maven 会自动从 Maven 仓库下载 Gson 库并将其添加到项目的 classpath 中。然后,你可以通过在代码中导入 Gson 类来使用它,例如: ```java import com.google.gson.Gson; public class Example { public static void main(String[] args) { Gson gson = new Gson(); // 使用 Gson 进行 JSON 序列化和反序列化等操作 } } ``` ### 回答2: 要配置 Maven 使用 Gson,首先需要在项目的 pom.xml 文件中引入 Gson 的依赖。在 `<dependencies>` 标签中添加以下代码: ```xml <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.8</version> </dependency> ``` 这将下载 Gson 的 jar 文件并添加到项目的类路径中。 完成依赖配置后,你可以在代码中使用 Gson 了。首先,需要导入 Gson 类: ```java import com.google.gson.Gson; ``` 然后,你可以创建 Gson 对象并使用其提供的方法进行序列化和反序列化操作。例如,将一个对象转换为 JSON 字符串: ```java Gson gson = new Gson(); String json = gson.toJson(object); ``` 其中,`object` 是你要转换的对象。你可以将 JSON 字符串转换为对象: ```java String json = "{'name':'John', 'age':30}"; Person person = gson.fromJson(json, Person.class); ``` 其中,`Person` 是你的对象类。 配置完成后,你便可以在项目中使用 Gson 进行 JSON 数据的序列化和反序列化操作了。 ### 回答3: 在Maven项目中配置Gson非常简单。首先,需要在项目的pom.xml文件中添加Gson依赖项。可以使用以下代码将Gson添加到Maven项目中: ```xml <dependencies> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.6</version> </dependency> </dependencies> ``` 在添加依赖项之后,Maven会自动下载并将Gson库添加到项目中。 完成这一步骤后,就可以在项目的Java代码中使用Gson了。首先,需要在代码中导入Gson类。代码示例如下: ```java import com.google.gson.Gson; ``` 然后,可以创建一个Gson对象并使用其提供的方法进行相关操作。例如,可以将一个Java对象序列化为JSON字符串,或将一个JSON字符串反序列化为一个Java对象。以下是一个简单的示例: ```java public class Main { public static void main(String[] args) { // 创建Gson对象 Gson gson = new Gson(); // 将Java对象序列化为JSON字符串 Person person = new Person("John", "Doe", 30); String json = gson.toJson(person); System.out.println(json); // 将JSON字符串反序列化为Java对象 String json2 = "{\"firstName\":\"Jane\",\"lastName\":\"Smith\",\"age\":25}"; Person person2 = gson.fromJson(json2, Person.class); System.out.println(person2.getFirstName()); System.out.println(person2.getLastName()); System.out.println(person2.getAge()); } } ``` 这样,我们就成功地在Maven项目中配置了Gson并使用它进行了相关操作

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值