You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 10:01:46