如何解决Java读取ndJSON映射CustomerFeedDTO的Gson异常
问题分析与解决
异常原因
你遇到的Expected BEGIN_ARRAY but was BEGIN_OBJECT异常,核心是JSON结构与DTO类字段类型完全不匹配:
- JSON里的
Top-level、profile、phone、orders都是对象(用{}包裹),但你在CustomerFeedDTO里把这些字段都定义成了ArrayList<?>(数组类型),Gson解析时发现实际是对象却要映射到数组,直接抛出类型不匹配的异常。 - 只有
addresses、customs是JSON数组(用[]包裹),适合用List类型。
解决方案
需要根据JSON的实际结构,创建对应的实体类来映射,不能统一用ArrayList。以下是完整修正步骤:
1. 创建各子实体类
TopLevel.java
public class TopLevel { private String customer_no; private String created; private String last_visited_day_time; private String login; // Getters and Setters }
Profile.java
public class Profile { private String salutation; private String title; private String company; private String job_title; private String first_name; private String last_name; private String name_suffix; private String gender; private String birthday; private String email; private String next_birthday; private String second_name; // Getters and Setters }
Phone.java
public class Phone { private String home_phone; private String business_phone; private String mobile_phone; private String fax_number; // Getters and Setters }
Address.java
public class Address { private String address_id; private String title; private String company; private String salutation; private String first_name; private String last_name; private String second_name; private String suffix; private String address_1; private String address_2; private String suite_no; private String postal_box; private String city; private String postal_code; private String country; private String state; private String contact_phone; // Getters and Setters }
Order.java
public class Order { private String order_id; private String order_date; // Getters and Setters }
Orders.java
注意JSON里的orders是包含计数和索引对象的特殊结构,需要用注解映射字段名:
import com.google.gson.annotations.SerializedName; public class Orders { private int placed_orders_count; private Order order0; private Order order1; @SerializedName("0") public Order getOrder0() { return order0; } public void setOrder0(Order order0) { this.order0 = order0; } @SerializedName("1") public Order getOrder1() { return order1; } public void setOrder1(Order order1) { this.order1 = order1; } // Getter and Setter for placed_orders_count }
2. 修正CustomerFeedDTO类
import com.google.gson.annotations.SerializedName; import java.util.List; public class CustomerFeedDTO { // 映射JSON里的"Top-level"字段 @SerializedName("Top-level") private TopLevel topLevel; private Profile profile; private Phone phone; private List<Address> addresses; private Orders orders; private List<Object> customs; // customs是空数组,用List<Object>即可 // Getters and Setters }
3. 验证解析代码
你的原解析代码无需修改,直接使用即可:
Gson gson = new Gson(); JsonReader reader = new JsonReader(new FileReader("customer.json")); CustomerFeedDTO customerFeedDTO = gson.fromJson(reader, CustomerFeedDTO.class);
修改后,Gson就能正确将JSON对象映射到对应的实体类,不会再抛出类型不匹配的异常。
内容的提问来源于stack exchange,提问作者Dragon
相关产品推荐
相关产品推荐

