boxmoe_header_banner_img

Hello! 欢迎来到悠悠畅享网!

文章导读

使用 Gson 解析复杂 JSON 结构到 Java 对象


avatar
作者 2025年9月9日 11

使用 Gson 解析复杂 JSON 结构到 Java 对象

本文介绍了如何使用 Gson 库将复杂的 JSON 结构解析为 Java 对象。重点讲解了如何定义与 json 结构对应的 Java 类,并使用 @SerializedName 和 @Expose 注解来控制序列化和反序列化的行为。通过示例代码,演示了如何处理嵌套的 List 结构,以及如何避免常见的 MalformedJsonException 异常,帮助开发者更好地理解和应用 Gson 库。

Gson 是一个强大的 Java 库,用于在 Java 对象和 JSON 数据之间进行转换。在处理复杂的 JSON 结构时,正确地定义 Java 类以及使用 Gson 的相关注解至关重要。本文将详细介绍如何使用 Gson 将复杂的 JSON 数据解析为 Java 对象。

定义 Java 类

首先,需要根据 JSON 的结构定义相应的 Java 类。JSON 中的每个字段都应该在 Java 类中有一个对应的属性。例如,对于以下 JSON 结构:

{   "title": "title",   "product" : [     {       "key": "product1",       "value": [{         "valueName": "productValue1"       }],       "date" : "2022-10-11"     },     {       "key": "product2",       "value": []     },     "date" : "2022-10-11"   ] }

可以定义以下 Java 类:

立即学习Java免费学习笔记(深入)”;

import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName;  import java.util.List;  public class ProductDTO {      @SerializedName("title")     @Expose     private String title;     @SerializedName("product")     @Expose     private List<Product> product = NULL;      public String getTitle() {         return title;     }      public void setTitle(String title) {         this.title = title;     }      public List<Product> getProduct() {         return product;     }      public void setProduct(List<Product> product) {         this.product = product;     }  }
import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName;  import java.util.List;  public class Product {      @SerializedName("key")     @Expose     private String key;     @SerializedName("value")     @Expose     private List<Value> value = null;      public String getKey() {         return key;     }      public void setKey(String key) {         this.key = key;     }      public List<Value> getValue() {         return value;     }      public void setValue(List<Value> value) {         this.value = value;     }  }
import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName;  public class Value {      @SerializedName("valueName")     @Expose     private String valueName;      public String getValueName() {         return valueName;     }      public void setValueName(String valueName) {         this.valueName = valueName;     }  }

注解说明:

使用 Gson 解析复杂 JSON 结构到 Java 对象

Groq

GroqChat是一个全新的ai聊天机器人平台,支持多种大模型语言,可以免费在线使用。

使用 Gson 解析复杂 JSON 结构到 Java 对象77

查看详情 使用 Gson 解析复杂 JSON 结构到 Java 对象

  • @SerializedName(“title”): 用于指定 JSON 字段与 Java 属性的对应关系。如果 JSON 字段的名称与 Java 属性的名称不一致,可以使用此注解进行映射。
  • @Expose: 用于控制字段是否参与序列化和反序列化。默认情况下,Gson 会序列化和反序列化所有字段。如果只想序列化或反序列化部分字段,可以使用此注解。

使用 Gson 进行解析

定义好 Java 类后,就可以使用 Gson 将 JSON 数据解析为 Java 对象了。

import com.google.gson.Gson;  public class GsonExample {      public static void main(String[] args) {         String jsonPayload = "{n" +                 "  "title": "title",n" +                 "  "product" : [n" +                 "    {n" +                 "      "key": "product1",n" +                 "      "value": [{n" +                 "        "valueName": "productValue1"n" +                 "      }],n" +                 "      "date" : "2022-10-11"n" +                 "    },n" +                 "    {n" +                 "      "key": "product2",n" +                 "      "value": []n" +                 "    },n" +                 "    "date" : "2022-10-11"n" +                 "  ]n" +                 "}";          Gson gson = new Gson();         ProductDTO productDTO = gson.fromJson(jsonPayload, ProductDTO.class);          System.out.println("Title: " + productDTO.getTitle());         if (productDTO.getProduct() != null) {             for (Product product : productDTO.getProduct()) {                 System.out.println("  Key: " + product.getKey());                 if (product.getValue() != null) {                     for (Value value : product.getValue()) {                         System.out.println("    ValueName: " + value.getValueName());                     }                 } else {                     System.out.println("    Value: null");                 }             }         } else {             System.out.println("Product List: null");         }      } }

代码解释:

  1. 创建 Gson 对象:Gson gson = new Gson();
  2. 调用 fromJson() 方法:ProductDTO productDTO = gson.fromJson(jsonPayload, ProductDTO.class); 该方法将 JSON 字符串 jsonPayload 解析为 ProductDTO 类型的对象。

注意事项

  • 异常处理: 在使用 fromJson() 方法时,可能会抛出 JsonSyntaxException 异常,表示 JSON 字符串的格式不正确。需要进行适当的异常处理。
  • 字段类型匹配: 确保 Java 类的字段类型与 JSON 数据的类型匹配。例如,如果 JSON 字段是字符串类型,则 Java 类的对应属性也应该是字符串类型。
  • 处理空值: 如果 JSON 数据中包含空值 (null),Gson 会将对应的 Java 属性设置为 null。需要注意处理这些空值,避免出现 NullPointerException 异常。
  • 日期格式: 如果 JSON 数据中包含日期字段,可以使用 GsonBuilder 配置日期格式。

总结

使用 Gson 解析 JSON 数据到 Java 对象需要正确定义 Java 类,并使用 @SerializedName 和 @Expose 注解来控制序列化和反序列化的行为。 此外,还需要注意异常处理、字段类型匹配和处理空值等问题。 掌握这些技巧可以更有效地使用 Gson 库处理复杂的 JSON 数据。



评论(已关闭)

评论已关闭