[英]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.