预计BEGIN_OBJECT但在第1行第13列是BEGIN_ARRAY

时间:2016-03-18 18:05:56

标签: java json hashmap gson

我有这种格式的Json String。

{
    "columns": ["One", "Two", "Three"],
    "columnNames": ["One", "Two", "Three"],
    "isCTemplate": [true, true, true],
    "isCrequired": [false, false, false],
    "columnSizes": [10, 50, -1],
    "columnFormats": ["TEXT", "TEXT", "BOOLEAN(true/false)"],
    "parseErrors": null,
    "data": [
        ["a", "f", "8"],
        ["b", "e", "82"],
        ["c", "d", "822"]
    ],
    "numberOfRecordsInserted": 0,
    "dataErrors": [null, null, null],
    "dataWarnings": ["1", "2", "3"],
    "templateCH": ["One", "Two", "Three"],
    "importS": [null, null, null],
    "formatTypeMap": {
        "array": "TEXT",
        "boolean": "BOOLEAN(true/false)",
        "currency": "CURRENCY"
    },
    "TypeId": "acc",
    "isColumn": [false, false, false],
    "prefixed": [],
    "missed": "tEST",
    "duplicateS": null,
    "global": null,
    "y": 0,
    "s": 1,
    "m": 2,
    "f": 3,
    "vStatus": {
        "vRows": 5,
        "v": 5
    }
}

我的Jsonhelper班,

public class CopyOfTViewsJSONS {
    @JsonProperty("columns")
    public List<String> columns=new ArrayList<String>();

    @JsonProperty("columnNames")
    public List<String> columnNames=new ArrayList<String>();

    @JsonProperty("isCTemplate")
    public List<String> isCTemplate=new ArrayList<String>();

    @JsonProperty("isCrequired")
    public List<String> isCrequired=new ArrayList<String>();

    @JsonProperty("columnSizes")
    public List<String> columnSizes=new ArrayList<String>();

    @JsonProperty("columnFormats")
    public List<String> columnFormats=new ArrayList<String>();

    @JsonProperty("parseErrors")
    public List<String> parseErrors=new ArrayList<String>();

    @JsonProperty("data")
    public List<List<String>> data=new ArrayList<List<String>>();

    @JsonProperty("numberOfRecordsInserted")
    public int numberOfRecordsInserted;

    @JsonProperty("dataErrors")
    public List<String> dataErrors=new ArrayList<String>();

    @JsonProperty("dataWarnings")
    public List<String> dataWarnings=new ArrayList<String>();

    @JsonProperty("templateCH")
    public List<String> templateCH=new ArrayList<String>();

    @JsonProperty("importS")
    public List<String> importS=new ArrayList<String>();

    @JsonProperty("formatTypeMap")
    public HashMap<String, String> formatTypeMap=new HashMap<String, String>();

    @JsonProperty("TypeId")
    public String TypeId;

    @JsonProperty("prefixed")
    public List<String> prefixed=new ArrayList<String>();

    @JsonProperty("missed")
    public List<String> missed=new ArrayList<String>();

    @JsonProperty("duplicateS")
    public List<String> duplicateS=new ArrayList<String>();

    @JsonProperty("global")
    public List<String> global=new ArrayList<String>();

    @JsonProperty("Y")
    public int Y;

    @JsonProperty("s")
    public int s;

    @JsonProperty("m")
    public int m;

    @JsonProperty("f")
    public int f;

    @JsonProperty("vStatus")
    public HashMap<String, String> vStatus=new HashMap<String, String>();


    }

我试图以这种方式将json字符串分配给HashMap<String,CopyOfTViewsJSONS>

HashMap<String,CopyOfTViewsJSONS> mapsss = new Gson().fromJson(tmp, new TypeToken<HashMap<String, CopyOfTViewsJSONS >>(){}.getType());

但我得到了java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 13<br />com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 13 Exception.

我第一次使用json和gson库。

任何人都可以帮我解决这个问题吗?

由于

1 个答案:

答案 0 :(得分:3)

为什么要尝试将JSON反序列化为Map<String, CopyOfTViewsJSONS>?据我所知,从你发布的类和JSON中,JSON完美地代表了CopyOfTViewsJSONS类的一个实例。因此,您应该能够像这样反序列化它:

CopyOfTViewsJSONS result = new Gson().fromJson(tmp, CopyOfTViewsJSONS.class);

但是,这有一个小问题,因为"missed"属性在您的类中被错误地映射。在您的JSON示例中,"missed"String,但在类中它是List<String>。将类字段更改为String可解决此问题:

@JsonProperty("missed")
public String missed;

然后,您可以打印出结果的某些属性,以确认它是否已正确反序列化:

System.out.println(result.columns);                  // prints [One, Two, Three]
System.out.println(result.numberOfRecordsInserted);  // prints 0
System.out.println(result.TypeId);                   // prints acc
System.out.println(result.vStatus);                  // prints {v=5, vRows=5}