0

The JSON:

[{"DataContainer": {
      "ShoppingDetails": [
        [
          {
            "Value": "3",
            "Name": "Price"
          },
          {
            "Value": "XAV-13-9LO",
            "Name": "Item Code"
          }
        ],
        [
          {
            "Value": "9",
            "Name": "Price"
          },
          {
            "Value": "WEB-13-9XH",
            "Name": "Item Code"
          }
        ]
      ]
    }
 }]

I already have a class DataContainer:

public class DataContainer extends WebResp{
    @SerializedName("ShoppingDetails")
    private ShoppingDetails[] shoppingDetails;

    public ShoppingDetails[] getShoppingDetails() {
        return shoppingDetails;
    }

    public void setShoppingDetails(ShoppingDetails[] shoppingDetails) {
        this.shoppingDetails= shoppingDetails;
    }
}

and class ShoppingDetails:

public class ShoppingDetails{
    private Field[] field;

    public Field[] getField() {
        return field;
    }

    public void setField(Field[] field) {
        this.field= field;
   }
}

But unfortunately, I ended up with com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 61 column 10 path $[0].DataContainer.ShoppingDetails[0]

Could someone point me in the right direction as to map this JSON to a Java object using GSON?

redflour
  • 173
  • 1
  • 12
  • 3
    You declared `shoppingDetails` as an array but it's an array of array in your JSON. – D.B. Oct 14 '17 at 01:52
  • 1
    *"Why does GSON give me an error when parsing an **array of array** of objects?"* Your title says it all. "**array of array**". `shoppingDetails` must be a `Field[][]`, i.e. an array of array of `Field`. And `Field` should then be a class with two `String` fields annotated with `@SerializedName("Value")` and `@SerializedName("Name")`. – Andreas Oct 14 '17 at 02:07
  • 1
    Ah! Thank you very much both of you. It really is an amature mistake. Is there a way to accept a comment as an answer? – redflour Oct 14 '17 at 02:20
  • @Andreas should post the comment as an answer, which can then be accepted – Zoey Hewll Oct 14 '17 at 03:19

1 Answers1

0
  • add DataBean

  • use Gson to parse it

1.DataBean

public class DataBean {

private DataContainerBean DataContainer;

public DataContainerBean getDataContainer() {
    return DataContainer;
}

public void setDataContainer(DataContainerBean DataContainer) {
    this.DataContainer = DataContainer;
}

public static class DataContainerBean {
    /**
     * Value : 3
     * Name : Price
     */

    private List<List<ShoppingDetailsBean>> ShoppingDetails;

    public List<List<ShoppingDetailsBean>> getShoppingDetails() {
        return ShoppingDetails;
    }

    public void setShoppingDetails(List<List<ShoppingDetailsBean>> ShoppingDetails) {
        this.ShoppingDetails = ShoppingDetails;
    }

    public static class ShoppingDetailsBean {
        private String Value;
        private String Name;

        public String getValue() {
            return Value;
        }

        public void setValue(String Value) {
            this.Value = Value;
        }

        public String getName() {
            return Name;
        }

        public void setName(String Name) {
            this.Name = Name;
        }
    }
}
}

2.use Gson tp parse

Gson gson = new Gson();
try {
    JSONArray jsonArray = new JSONArray(response);
    for (int i = 0; i < jsonArray.length(); i++) {
        DataBean dataBean = gson.fromJson(jsonArray.getJSONObject(i).toString(),DataBean.class);
    }
} catch (JSONException e) {
    e.printStackTrace();
}
KeLiuyue
  • 8,149
  • 4
  • 25
  • 42