繁体   English   中英

使用GSON的JSON字符串到Java对象

[英]JSON String to Java object using GSON

我试图将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;

Box是Latitude对象和Longitude对象,它们都是相同的。

private String b;
private String d;

我可以将更高级别的属性(lat1,lat2,long1和long2)解析为一个只有4个属性的更简单的BoxSearch对象。 当json和对象更复杂时会出现问题。 甚至可以做我正在尝试的事情吗?

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

谢谢。

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

很容易。

出错的原因是顶层的JSON是一个数组,而不是一个对象。 这是由GSON投掷“预期BEGIN_OBJECT但是BEGIN_ARRAY”?

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

从上面的评论编辑:

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

基于您的Java BoxSearch类,您需要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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM