当前位置: 首页 > 知识库问答 >
问题:

当映射到getter/setter时,使用GSON从POST请求解析json时出错

周墨一
2023-03-14

当向运行Jetty的RESful API发送JSON POST请求时,我正在解析请求中接收到的JSON数据,并尝试将其映射到构造函数类。当接收到的数据不在getter/setter的精确布局中时,问题就会出现。

Vehicle v = new Gson().fromJson(req.getReader(), Vehicle.class);

我希望输出能够正确解析,因为API应该读取每个键并将其映射到getter和setter,这样我就可以访问它了

v.getVehicle_id();

但是,当发送不在getter/setter的确切布局中的JSON数据时。它会导致一个错误,因为它希望第一个输入的值是带整数的“vehicle_id”,而有时它会得到一个不同的值,例如带字符串“black”的“color”。

有没有更好的方法在JSON进入时解析它?我必须使用Gson,因为它是为一个大学作业。

这是我的车

public class Vehicle {

    public Vehicle() {
    }

    /*
     * Maps the database into this class so they can be used in the getter/setter, they are private as other classes don't need access to them
     * This is because they go through the getters/setters, which are public.
     */
    private int vehicle_id;
    private String make;
    private String model;
    private int year;
    private int price;
    private String license_number;
    private String colour;
    private int number_doors;
    private String transmission;
    private int mileage;
    private String fuel_type;
    private int engine_size;
    private String body_style;
    private String condition;
    private String notes;

    public Vehicle(int vehicle_id, String make, String model, int
            year, int price, String license_number, String colour, int
            number_doors, String transmission, int mileage, String fuel_type,
            int engine_size, String body_style, String condition, String
            notes) {

            this.vehicle_id = vehicle_id;
            this.make = make;
            this.model = model;
            this.year = year;
            this.price = price;
            this.license_number = license_number;
            this.colour = colour;
            this.number_doors = number_doors;
            this.transmission = transmission;
            this.mileage = mileage;
            this.fuel_type = fuel_type;
            this.engine_size = engine_size;
            this.body_style = body_style;
            this.condition = condition;
            this.notes = notes;
        }

    /*
     * Creates the getter and setters which map to the database so they can be used by the Controller to store and retrieve data when needed.
     */

    public int getVehicle_id() {
        return vehicle_id;
    }

    public void setVehicle_id(int vehicle_id) {
        this.vehicle_id = vehicle_id;
    }

    public String getMake() {
        return make;
    }

    public void setMake(String make) {
        this.make = make;
    }

    public String getModel() {
        return model;
    }

    public void setModel(String model) {
        this.model = model;
    }

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        this.year = year;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public String getLicense_number() {
        return license_number;
    }

    public void setLicense_number(String license_number) {
        this.license_number = license_number;
    }

    public String getColour() {
        return colour;
    }

    public void setColour(String colour) {
        this.colour = colour;
    }

    public int getNumber_doors() {
        return number_doors;
    }

    public void setNumber_doors(int number_doors) {
        this.number_doors = number_doors;
    }

    public String getTransmission() {
        return transmission;
    }

    public void setTransmission(String transmission) {
        this.transmission = transmission;
    }

    public int getMileage() {
        return mileage;
    }

    public void setMileage(int mileage) {
        this.mileage = mileage;
    }

    public String getFuel_type() {
        return fuel_type;
    }

    public void setFuel_type(String fuel_type) {
        this.fuel_type = fuel_type;
    }

    public int getEngine_size() {
        return engine_size;
    }

    public void setEngine_size(int engine_size) {
        this.engine_size = engine_size;
    }

    public String getBody_style() {
        return body_style;
    }

    public void setBody_style(String body_style) {
        this.body_style = body_style;
    }

    public String getCondition() {
        return condition;
    }

    public void setCondition(String condition) {
        this.condition = condition;
    }

    public String getNotes() {
        return notes;
    }

    public void setNotes(String notes) {
        this.notes = notes;
    }
}

这是我的JSON数据

{"colour":"Black","license_number":"DA98 7BK","body_style":"Small","engine_size":"1","number_doors":"Black","transmission":"manual","year":"2009","price":"10000","make":"Ford","vehicle_id":"8","notes":"Old","fuel_type":"Petrol","condition":"Old","mileage":"20000","model":"Ka"}

这是我从服务器收到的错误

2019-03-28 12:51:41.703:warn:oejs.httpchannel:qtp1225358173-9:/vehicledb/api com.google.gson.jsonSyntaxException:java.lang.NumberFormatException:对于输入字符串:“黑色”

共有1个答案

微生令
2023-03-14

修复了它,我使用了一个hashmap,然后使用gson.toJson将其转换为Json。

我现在正在使用一个构造函数,将我的值添加到它中,然后将它转换为JSON。

 类似资料:
  • 我的JSON格式为 如何使用jackson JSON映射器将其映射到POJOs以避免400个坏请求。 我试过了 我的控制器 多谢了。

  • 问题内容: 我有以下JSON表示盐请求的服务器响应: 我尝试使用以下POJO映射它: 现在每次我这样做: 该为空。如何使用Gson将JSON映射到POJO?我的变量顺序对Gson映射重要吗? 问题答案: 我的变量顺序对Gson映射重要吗? 不,不是这样。 如何使用Gson将JSON映射到POJO? 它是 区分大小写 和JSON字符串键应该是相同的POJO类使用的变量名。 您可以使用@Seriali

  • 我有以下JSON来表示salt请求的服务器响应: 我尝试用以下POJO映射它: 每次我这样做: 为空。如何使用GSON将JSON映射到POJO?变量的顺序对Gson映射重要吗?

  • 问题内容: 我有以下JSON响应 我为GSON请求创建了以下类。如何发出GSON请求并使用截击请求存储响应的值。GSON请求应该是什么样的? 问题答案: 只需按以下步骤创建一个类(取自Android Developer Docs ) 现在,在您的类文件(活动)中,只需按如下所示调用此类: 我们还需要创建两种方法- -收到来自的回复 -处理任何错误 如下: 和 我希望这会有意义。

  • 问题内容: 我正在尝试解析相同的JSON,但是现在我对类进行了一些更改。 我的班级现在看起来像: 此代码引发异常, 可以理解,因为按照我上一个问题的解决方案,GSON希望将Enum对象实际创建为 但是,由于从语法上讲这是不可能的,因此推荐的解决方案和解决方法是什么? 问题答案: 从Gson的文档中: Gson为枚举提供了默认的序列化和反序列化…如果您想更改默认的表示形式,则可以通过GsonBuil

  • 我试图向服务器发出POST请求,但我遇到了一个问题。服务器似乎收到了请求,但我仍然在控制台中看到一个错误,建议将主体从Object更改为JSON 错误:SyntaxError:JSON中位于JSON位置0处的意外标记A。在XMLHttpRequest处解析()。装载(http://localhost:4200/vendor.js:69142:51)text:“它是用id=:23保存的新用户”pro