Java 应为BEGIN_对象,但在第1行第2列为BEGIN_数组(小编辑)

Java 应为BEGIN_对象,但在第1行第2列为BEGIN_数组(小编辑),java,android,json,web-services,Java,Android,Json,Web Services,我这里有一个web服务,它为我提供了以下JSON代码: [ { "_OrderDetails": [ { "ProductName": "FUCHS SUPER GT SAE 10W30 6X5 / FP10100010102", "TotalAfterDiscount_Lc": "7500", "MeasureUnitName": "كرتونة", "TotalPrice_Lc": "7500",

我这里有一个web服务,它为我提供了以下JSON代码:

[
  {
    "_OrderDetails": [
      {
         "ProductName": "FUCHS SUPER GT SAE 10W30 6X5 / FP10100010102",
        "TotalAfterDiscount_Lc": "7500",
        "MeasureUnitName": "كرتونة",
        "TotalPrice_Lc": "7500",
        "PricePerUnit_Lc": "75",
        "Quantity": "100"
      }
    ],
    "Id": "274",
    "OrderDate": "4/10/2014 12:00:00 AM",
    "Number": "16",
    "CustomerName": "الأسد",
    "Note": ""
  }
]
我制作了一个java类(实体),其中包含所有数据的getter和setter:

package com.example.webservicetest;

import java.util.List;

public class Item {

private String OrderDate;
private String Number;
private String Note;
private String CustomerName;
private String Id;
private List<_OrderDetails> orderDetails;



public String getOrderDate() {
    return OrderDate;
}
public void setOrderDate(String orderDate) {
    OrderDate = orderDate;
}
public String getNumber() {
    return Number;
}
public void setNumber(String number) {
    Number = number;
}
public String getNote() {
    return Note;
}
public void setNote(String note) {
    Note = note;
}

public String getId() {
    return Id;
}
public void setId(String id) {
    Id = id;
}
public String getCustomerName() {
    return CustomerName;
}
public void setCustomerName(String customerName) {
    CustomerName = customerName;
}
public List<_OrderDetails> getOrderDetails() {
    return orderDetails;
}
public void setOrderDetails(List<_OrderDetails> orderDetails) {
    this.orderDetails = orderDetails;
}
public class _OrderDetails{
    private String OrderId;
    private String OrderDate;
    private String Number;
    private String Note;
    private String ProductName;
    private String TotalAfterDiscount_Lc;
    private String MeasureUnitName;
    private String TotalPrice_Lc;
    private String PricePerUnit_Lc;
    private String Quantity;
    public String getOrderId() {
        return OrderId;
    }
    public void setOrderId(String orderId) {
        OrderId = orderId;
    }
    public String getOrderDate() {
        return OrderDate;
    }
    public void setOrderDate(String orderDate) {
        OrderDate = orderDate;
    }
    public String getNumber() {
        return Number;
    }
    public void setNumber(String number) {
        Number = number;
    }
    public String getNote() {
        return Note;
    }
    public void setNote(String note) {
        Note = note;
    }
    public String getProductName() {
        return ProductName;
    }
    public void setProductName(String productName) {
        ProductName = productName;
    }
    public String getTotalAfterDiscount_Lc() {
        return TotalAfterDiscount_Lc;
    }
    public void setTotalAfterDiscount_Lc(String totalAfterDiscount_Lc) {
        TotalAfterDiscount_Lc = totalAfterDiscount_Lc;
    }
    public String getMeasureUnitName() {
        return MeasureUnitName;
    }
    public void setMeasureUnitName(String measureUnitName) {
        MeasureUnitName = measureUnitName;
    }
    public String getTotalPrice_Lc() {
        return TotalPrice_Lc;
    }
    public void setTotalPrice_Lc(String totalPrice_Lc) {
        TotalPrice_Lc = totalPrice_Lc;
    }
    public String getPricePerUnit_Lc() {
        return PricePerUnit_Lc;
    }
    public void setPricePerUnit_Lc(String pricePerUnit_Lc) {
        PricePerUnit_Lc = pricePerUnit_Lc;
    }
    public String getQuantity() {
        return Quantity;
    }
    public void setQuantity(String quantity) {
        Quantity = quantity;
    }

}

}
但我在日志中看到以下例外情况:
应为BEGIN_对象,但在第1行第2列为BEGIN_数组


请问我做错了什么?

查看您的代码,获取
对象的正确方法是

Item[] placelist = gson.fromJson(responseJSON, Item[].class);    
因为您的JSON是一个
对象列表
[
(BEGIN\u数组)

引发异常,因为Gson需要单个项对象
{
(BEGIN\u对象),但它是数组


不能以两种方式反序列化同一个JSON,即数组和对象。如果JSON是数组,则将其反序列化为数组;如果JSON是对象,则将其反序列化为对象,但不能以两种方式反序列化。

JSON输出是一个列表

// This parses your JSON
Item[] items = new Gson().fromJson(responseJson, Item[].class);

在此之后,实际上您将拥有一个项目数组,因为您拥有的是一个对象数组,而不是一个对象。这就是为什么第二行可以工作,第三行不能工作的原因。因此,如果您想将此json解析为一个项目[]placelist,则无需更改任何内容。如果您想将其解析为一个对象,则应删除以下括号:

Item[] placelist;
placelist = gson.fromJson(responseJSON, Item[].class);
Item item = gson.fromJson(responseJSON, Item.class);
{
"_OrderDetails": [
  {
     "ProductName": "FUCHS SUPER GT SAE 10W30 6X5 / FP10100010102",
    "TotalAfterDiscount_Lc": "7500",
    "MeasureUnitName": "كرتونة",
    "TotalPrice_Lc": "7500",
    "PricePerUnit_Lc": "75",
    "Quantity": "100"
  }
],
"Id": "274",
"OrderDate": "4/10/2014 12:00:00 AM",
"Number": "16",
"CustomerName": "الأسد",
"Note": ""
}

或者像数组一样解析它并检索第一个元素


更新

Item[] placelist = gson.fromJson(responseJSON, Item[].class);
工作正常,并且您有一个项目数组。但是OrderDetails的名称有问题。在json中,它是一个“\u OrderDetails”,在代码中是“OrderDetails”。您可以在字段上添加注释:

@SerializedName("_OrderDetails")
    private List<_OrderDetails> orderDetails;
@SerializedName(“\u OrderDetails”)
私人名单详情;
要测试的完整代码:

import com.google.gson.Gson;
import com.google.gson.annotations.SerializedName;

import java.util.Arrays;
import java.util.List;

public class Main {
public static void main(String[] args) {
    String responseJSON = "[\n" +
            "  {\n" +
            "    \"_OrderDetails\": [\n" +
            "      {\n" +
            "         \"ProductName\": \"FUCHS SUPER GT SAE 10W30 6X5 / FP10100010102\",\n" +
            "        \"TotalAfterDiscount_Lc\": \"7500\",\n" +
            "        \"MeasureUnitName\": \"كرتونة\",\n" +
            "        \"TotalPrice_Lc\": \"7500\",\n" +
            "        \"PricePerUnit_Lc\": \"75\",\n" +
            "        \"Quantity\": \"100\"\n" +
            "      }\n" +
            "    ],\n" +
            "    \"Id\": \"274\",\n" +
            "    \"OrderDate\": \"4/10/2014 12:00:00 AM\",\n" +
            "    \"Number\": \"16\",\n" +
            "    \"CustomerName\": \"الأسد\",\n" +
            "    \"Note\": \"\"\n" +
            "  }\n" +
            "]";

    Item[] placelist;
    Gson gson = new Gson();
    placelist = gson.fromJson(responseJSON, Item[].class);
    System.out.println(Arrays.toString(placelist));
}


public class Item {

    private String OrderDate;
    private String Number;
    private String Note;
    private String CustomerName;
    private String Id;
    @SerializedName("_OrderDetails")
    private List<_OrderDetails> orderDetails;


    public String getOrderDate() {
        return OrderDate;
    }

    public void setOrderDate(String orderDate) {
        OrderDate = orderDate;
    }

    public String getNumber() {
        return Number;
    }

    public void setNumber(String number) {
        Number = number;
    }

    public String getNote() {
        return Note;
    }

    public void setNote(String note) {
        Note = note;
    }

    public String getId() {
        return Id;
    }

    public void setId(String id) {
        Id = id;
    }

    public String getCustomerName() {
        return CustomerName;
    }

    public void setCustomerName(String customerName) {
        CustomerName = customerName;
    }

    public List<_OrderDetails> getOrderDetails() {
        return orderDetails;
    }

    public void setOrderDetails(List<_OrderDetails> orderDetails) {
        this.orderDetails = orderDetails;
    }

    @Override
    public String toString() {
        return "Item{" +
                "OrderDate='" + OrderDate + '\'' +
                ", Number='" + Number + '\'' +
                ", Note='" + Note + '\'' +
                ", CustomerName='" + CustomerName + '\'' +
                ", Id='" + Id + '\'' +
                ", orderDetails=" + orderDetails +
                '}';
    }

    public class _OrderDetails {
        private String OrderId;
        private String OrderDate;
        private String Number;
        private String Note;
        private String ProductName;
        private String TotalAfterDiscount_Lc;
        private String MeasureUnitName;
        private String TotalPrice_Lc;
        private String PricePerUnit_Lc;
        private String Quantity;

        public String getOrderId() {
            return OrderId;
        }

        public void setOrderId(String orderId) {
            OrderId = orderId;
        }

        public String getOrderDate() {
            return OrderDate;
        }

        public void setOrderDate(String orderDate) {
            OrderDate = orderDate;
        }

        public String getNumber() {
            return Number;
        }

        public void setNumber(String number) {
            Number = number;
        }

        public String getNote() {
            return Note;
        }

        public void setNote(String note) {
            Note = note;
        }

        public String getProductName() {
            return ProductName;
        }

        public void setProductName(String productName) {
            ProductName = productName;
        }

        public String getTotalAfterDiscount_Lc() {
            return TotalAfterDiscount_Lc;
        }

        public void setTotalAfterDiscount_Lc(String totalAfterDiscount_Lc) {
            TotalAfterDiscount_Lc = totalAfterDiscount_Lc;
        }

        public String getMeasureUnitName() {
            return MeasureUnitName;
        }

        public void setMeasureUnitName(String measureUnitName) {
            MeasureUnitName = measureUnitName;
        }

        public String getTotalPrice_Lc() {
            return TotalPrice_Lc;
        }

        public void setTotalPrice_Lc(String totalPrice_Lc) {
            TotalPrice_Lc = totalPrice_Lc;
        }

        public String getPricePerUnit_Lc() {
            return PricePerUnit_Lc;
        }

        public void setPricePerUnit_Lc(String pricePerUnit_Lc) {
            PricePerUnit_Lc = pricePerUnit_Lc;
        }

        public String getQuantity() {
            return Quantity;
        }

        public void setQuantity(String quantity) {
            Quantity = quantity;
        }

        @Override
        public String toString() {
            return "_OrderDetails{" +
                    "OrderId='" + OrderId + '\'' +
                    ", OrderDate='" + OrderDate + '\'' +
                    ", Number='" + Number + '\'' +
                    ", Note='" + Note + '\'' +
                    ", ProductName='" + ProductName + '\'' +
                    ", TotalAfterDiscount_Lc='" + TotalAfterDiscount_Lc + '\'' +
                    ", MeasureUnitName='" + MeasureUnitName + '\'' +
                    ", TotalPrice_Lc='" + TotalPrice_Lc + '\'' +
                    ", PricePerUnit_Lc='" + PricePerUnit_Lc + '\'' +
                    ", Quantity='" + Quantity + '\'' +
                    '}';
        }
    }

}
import com.google.gson.gson;
导入com.google.gson.annotations.SerializedName;
导入java.util.array;
导入java.util.List;
公共班机{
公共静态void main(字符串[]args){
字符串responseJSON=“[\n”+
“{\n”+
“\”\u OrderDetails\”:[\n”+
“{\n”+
“\'ProductName\:\'FUCHS SUPER GT SAE 10W30 6X5/FP1010000102\',\n”+
“TotalAfterDiscount\u Lc\”:“7500\”,\n+
“度量单位名称”:“度量单位名称”+
“\'TotalPrice\u Lc\”:\'7500\,\n”+
“\'PricePerUnit\u Lc\”:\'75\,\n”+
“\”数量\“:\”100\“\n”+
“}\n”+
“],\n”+
“\“Id\:\“274\”,\n”+
“\'OrderDate\':\'2014年10月4日上午12:00:00\',\n”+
“\”数字\“:\”16\“,\n”+
“客户名称”:“客户名称”+
“\”注意\“:\”\“\n”+
“}\n”+
"]";
项目[]位置列表;
Gson Gson=新的Gson();
placelist=gson.fromJson(responseJSON,Item[].class);
System.out.println(Arrays.toString(placelist));
}
公共类项目{
私有字符串OrderDate;
私有字符串编号;
私人弦乐;
私有字符串客户名称;
私有字符串Id;
@SerializedName(“\u OrderDetails”)
私人名单详情;
公共字符串getOrderDate(){
退货日期;
}
public void setOrderDate(字符串orderDate){
OrderDate=OrderDate;
}
公共字符串getNumber(){
返回号码;
}
公共无效集合号(字符串号){
数字=数字;
}
公共字符串getNote(){
退货单;
}
公共无效设置注释(字符串注释){
注=注;
}
公共字符串getId(){
返回Id;
}
公共无效集合id(字符串id){
Id=Id;
}
公共字符串getCustomerName(){
返回客户名称;
}
public void setCustomerName(字符串customerName){
客户名称=客户名称;
}
公共列表getOrderDetails(){
退货订单详情;
}
public void setOrderDetails(列出orderDetails){
this.orderDetails=orderDetails;
}
@凌驾
公共字符串toString(){
返回“项目{”+
“OrderDate=”+OrderDate+“\”+
“,数字=”“+Number+”\“””+
,Note='+Note+'\''+
“,CustomerName=”“+CustomerName+”\''+
“,Id=”+Id+“\”+
“,orderDetails=“+orderDetails+
'}';
}
公共类_OrderDetails{
私有字符串OrderId;
私有字符串OrderDate;
私有字符串编号;
私人弦乐;
私有字符串产品名称;
私人字符串TotalAfterDiscount\u Lc;
私有字符串MeasureUnitName;
私人字符串TotalPrice_Lc;
私人字符串PricePerUnit\u Lc;
私有字符串数量;
公共字符串getOrderId(){
返回订单ID;
}
公共无效setOrderId(字符串orderId){
OrderId=OrderId;
}
公共字符串getOrderDate(){
退货日期;
}
public void setOrderDate(字符串orderDate){
OrderDate=OrderDate;
}
公共字符串getNumber(){
返回号码;
}
公共无效集合号(字符串号){
数字=数字;
}
公共字符串getNote(){
退货单;
}
公共无效设置注释(字符串注释){
注=注;
}
公共字符串getProductName(){
返回产品名称;
}
公共无效setProductName(字符串productName){
ProductName=ProductName;
}
公共字符串getTotalAfterDiscount_Lc(){
返回总折扣(信用证);;
}
public void setTotalAfterDiscount\u Lc(字符串totalAfterDiscount\u Lc){
TotalAfterDiscount\u Lc=TotalAfterDiscount\u Lc;
}
公共字符串getMeasureUnitName(){
返回MeasureUnitName;
}
塞特米阿苏公共空间
import com.google.gson.Gson;
import com.google.gson.annotations.SerializedName;

import java.util.Arrays;
import java.util.List;

public class Main {
public static void main(String[] args) {
    String responseJSON = "[\n" +
            "  {\n" +
            "    \"_OrderDetails\": [\n" +
            "      {\n" +
            "         \"ProductName\": \"FUCHS SUPER GT SAE 10W30 6X5 / FP10100010102\",\n" +
            "        \"TotalAfterDiscount_Lc\": \"7500\",\n" +
            "        \"MeasureUnitName\": \"كرتونة\",\n" +
            "        \"TotalPrice_Lc\": \"7500\",\n" +
            "        \"PricePerUnit_Lc\": \"75\",\n" +
            "        \"Quantity\": \"100\"\n" +
            "      }\n" +
            "    ],\n" +
            "    \"Id\": \"274\",\n" +
            "    \"OrderDate\": \"4/10/2014 12:00:00 AM\",\n" +
            "    \"Number\": \"16\",\n" +
            "    \"CustomerName\": \"الأسد\",\n" +
            "    \"Note\": \"\"\n" +
            "  }\n" +
            "]";

    Item[] placelist;
    Gson gson = new Gson();
    placelist = gson.fromJson(responseJSON, Item[].class);
    System.out.println(Arrays.toString(placelist));
}


public class Item {

    private String OrderDate;
    private String Number;
    private String Note;
    private String CustomerName;
    private String Id;
    @SerializedName("_OrderDetails")
    private List<_OrderDetails> orderDetails;


    public String getOrderDate() {
        return OrderDate;
    }

    public void setOrderDate(String orderDate) {
        OrderDate = orderDate;
    }

    public String getNumber() {
        return Number;
    }

    public void setNumber(String number) {
        Number = number;
    }

    public String getNote() {
        return Note;
    }

    public void setNote(String note) {
        Note = note;
    }

    public String getId() {
        return Id;
    }

    public void setId(String id) {
        Id = id;
    }

    public String getCustomerName() {
        return CustomerName;
    }

    public void setCustomerName(String customerName) {
        CustomerName = customerName;
    }

    public List<_OrderDetails> getOrderDetails() {
        return orderDetails;
    }

    public void setOrderDetails(List<_OrderDetails> orderDetails) {
        this.orderDetails = orderDetails;
    }

    @Override
    public String toString() {
        return "Item{" +
                "OrderDate='" + OrderDate + '\'' +
                ", Number='" + Number + '\'' +
                ", Note='" + Note + '\'' +
                ", CustomerName='" + CustomerName + '\'' +
                ", Id='" + Id + '\'' +
                ", orderDetails=" + orderDetails +
                '}';
    }

    public class _OrderDetails {
        private String OrderId;
        private String OrderDate;
        private String Number;
        private String Note;
        private String ProductName;
        private String TotalAfterDiscount_Lc;
        private String MeasureUnitName;
        private String TotalPrice_Lc;
        private String PricePerUnit_Lc;
        private String Quantity;

        public String getOrderId() {
            return OrderId;
        }

        public void setOrderId(String orderId) {
            OrderId = orderId;
        }

        public String getOrderDate() {
            return OrderDate;
        }

        public void setOrderDate(String orderDate) {
            OrderDate = orderDate;
        }

        public String getNumber() {
            return Number;
        }

        public void setNumber(String number) {
            Number = number;
        }

        public String getNote() {
            return Note;
        }

        public void setNote(String note) {
            Note = note;
        }

        public String getProductName() {
            return ProductName;
        }

        public void setProductName(String productName) {
            ProductName = productName;
        }

        public String getTotalAfterDiscount_Lc() {
            return TotalAfterDiscount_Lc;
        }

        public void setTotalAfterDiscount_Lc(String totalAfterDiscount_Lc) {
            TotalAfterDiscount_Lc = totalAfterDiscount_Lc;
        }

        public String getMeasureUnitName() {
            return MeasureUnitName;
        }

        public void setMeasureUnitName(String measureUnitName) {
            MeasureUnitName = measureUnitName;
        }

        public String getTotalPrice_Lc() {
            return TotalPrice_Lc;
        }

        public void setTotalPrice_Lc(String totalPrice_Lc) {
            TotalPrice_Lc = totalPrice_Lc;
        }

        public String getPricePerUnit_Lc() {
            return PricePerUnit_Lc;
        }

        public void setPricePerUnit_Lc(String pricePerUnit_Lc) {
            PricePerUnit_Lc = pricePerUnit_Lc;
        }

        public String getQuantity() {
            return Quantity;
        }

        public void setQuantity(String quantity) {
            Quantity = quantity;
        }

        @Override
        public String toString() {
            return "_OrderDetails{" +
                    "OrderId='" + OrderId + '\'' +
                    ", OrderDate='" + OrderDate + '\'' +
                    ", Number='" + Number + '\'' +
                    ", Note='" + Note + '\'' +
                    ", ProductName='" + ProductName + '\'' +
                    ", TotalAfterDiscount_Lc='" + TotalAfterDiscount_Lc + '\'' +
                    ", MeasureUnitName='" + MeasureUnitName + '\'' +
                    ", TotalPrice_Lc='" + TotalPrice_Lc + '\'' +
                    ", PricePerUnit_Lc='" + PricePerUnit_Lc + '\'' +
                    ", Quantity='" + Quantity + '\'' +
                    '}';
        }
    }

}
public class Item implements Serializable {
    @SerializedName("_OrderDetails")
    private OrderDetails[] mOrderDetails;

    @SerializedName("Id")
    private String mId;

    @SerializedName("OrderData")
    private String mOrderDate;

    @SerializedName("Number")
    private String mNumber;

    @SerializedName("CustomerName")
    private String mCustomerName;

    @SerializedName("Note")
    private String mNote;

    // Add setters and getters

    public static class OrderDetails implements Serializable {
        @SerializedName("ProductName")
        private String mProductName;

        @SerializedName("TotalAfterDiscount_Lc")
        private String mTotalAfterDiscount;

        @SerializedName("MeasureUnitName")
        private String mMeasureUnitName;

        @SerializedName("TotalPrice_Lc"
        private String mTotalPrice;

        @SerializedName("PricePerUnit_Lc")
        private String mPricePerUnit;

        @SerializedName("Quantity")
        private String mQuantity;

        // Add setters and getters
    }
}
Gson gson = new Gson();
Item item = gson.fromJson(json, Item.class);