21

我正在尝试将json解析为java。

根据 jsonlint.com,我有以下有效的 json 字符串

private final static String LOC_JSON = 
         "["
        +"{"
        +"  \"lat1\": 39.737567,"
        +"  \"lat2\": 32.7801399,"
        +"  \"long1\": -104.98471790000002,"
        +"  \"long2\": -96.80045109999998"
        +"},"
        +"  ["
        +"      {"
        +"          \"lat\": {"
        +"              \"b\": 38.88368709500021,"
        +"              \"d\": 40.620468491667026"
        +"          },"
        +"          \"long\": {"
        +"          \"b\": -105.75306170749764,"
        +"          \"d\": -104.675854661387"
        +"          }"
        +"      }"
        +"  ]"
        +"]";

我正在尝试将其解析为一个对象,但出现以下错误。“预期为 BEGIN_OBJECT,但在第 1 行第 2 列是 BEGIN_ARRAY”

            Gson gson = new Gson();
        BoxSearch b = gson.fromJson( LOC_JSON, BoxSearch.class ); 

BoxSearch 由这个组成。

private Number lat1;
private Number lat2;
private Number long1;
private Number long2;
private Boxes[] boxes;

Boxes 是定义相同的纬度对象和经度对象。

private String b;
private String d;

我可以将更高级别的属性(lat1、lat2、long1 和 long2)解析为一个更简单的 BoxSearch 对象,它只有这 4 个属性。当 json 和对象更复杂时,麻烦就来了。甚至有可能做我正在尝试的事情吗?

我希望我已经提供了足够的信息来获得一些帮助。如果需要,我很乐意提供更多信息甚至是测试项目。我将其作为junit测试运行。

谢谢。

4

2 回答 2

31
Gson gson = new Gson();
gson.fromJson(jsonStr,YourClass.class);

很容易。

于 2015-12-18T06:57:40.650 回答
23

错误的原因是您的顶级 JSON 是一个数组,而不是一个对象。这被GSON 抛出“预期的 BEGIN_OBJECT 但是 BEGIN_ARRAY”所覆盖?.

但是,那里的解决方案不适用于您的 JSON,因为您有一个混合类型(一个对象和一个数组)的数组,而不是一个单一类型对象的数组。为此,您将不得不编写一个自定义反序列化器(请参阅涵盖此内容的 Gson 用户指南部分)或直接使用 Gson 的JsonParser类并从解析树中提取数据。

从上面的评论编辑:

如果您是创建 JSON 的人,看起来您想要的是一组BoxSearch对象?

根据您的 JavaBoxSearch类,您需要 JSON 结构如下:

[
    {
        "lat1" : 39.737567,
        "lat2" : 32.7801399,
        "long1" : -104.98471790000002,
        "long2" : -96.80045109999998,
        "boxes" : [ 
                    {
                      "lat": {
                          "b": 38.88368709500021,
                          "d": 40.620468491667026
                      },
                      "long": {
                          "b": -105.75306170749764,
                          "d": -104.675854661387
                      }
                    }
                  ]
    }
]

但是,您Boxes定义类的方式不适用于此。(你的意思是有一个数组吗?)。原样它需要看起来像:

class Boxes {
    Box lat;
    @SerializedName("long")
    Box lon;
}

class Box {
   String b;
   String d;
}

现在您有一个包含一种类型对象 ( ) 的数组BoxSearch,您可以使用它进行反序列化:

Type collectionType = new TypeToken<Collection<BoxSearch>>(){}.getType();
Collection<BoxSearch> boxSearchCollection = gson.fromJson(json, collectionType);

如果您真的不需要这些数组,请摆脱外部数组并简单地执行以下操作:

gson.fromJson(json, BoxSearch.class);
于 2013-05-23T20:31:00.390 回答