Gson到普通旧Java对象(POJO)
我已经阅读了GSon用户指南,并在这里查看了一些问题,但我真的很难理解为什么在尝试使用GSon创建java对象时出错Gson到普通旧Java对象(POJO),java,json,pojo,Java,Json,Pojo,我已经阅读了GSon用户指南,并在这里查看了一些问题,但我真的很难理解为什么在尝试使用GSon创建java对象时出错 public class TestJSON extends ActionBarActivity { private Location start; private String length; private String url = "http://maps.googleapis.com/maps/api/directions/json?origin="
public class TestJSON extends ActionBarActivity {
private Location start;
private String length;
private String url = "http://maps.googleapis.com/maps/api/directions/json?origin=";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_json);
// dummyprovider is provided by google to let me set a location.
start = new Location("dummyprovider");
start.setLatitude(51.5033630);
start.setLongitude(-0.1276250);
// Recieve an android warning if you run a retrieval task (such as JSON)
// in the main thread).
try {
System.out.println("printing Json");
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
toJava(readJsonFromUrl(urlBuilder()));
} catch (Exception e) {
e.printStackTrace();
}
}
});
thread.start();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.test_json, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
// I think in future I will call this function a ton of times and send it
// some locations as waypoints for it to try and get closer to the
// distances.
private String urlBuilder() {
String newUrl = url + start.getLatitude() + "," + start.getLongitude()
+ "&destination=51.5042178,23";
return newUrl;
}
// Builds the string for JSON.
private String readAll(Reader rd) throws IOException {
StringBuilder sb = new StringBuilder();
int cp;
while ((cp = rd.read()) != -1) {
sb.append((char) cp);
}
return sb.toString();
}
// Take an input url and reads from it using the url above. We then put it
// into a JSON object.
private JSONObject readJsonFromUrl(String url) throws IOException,
JSONException {
InputStream is = new URL(url).openStream();
try {
BufferedReader rd = new BufferedReader(new InputStreamReader(is,
Charset.forName("UTF-8")));
String jsonText = readAll(rd);
JSONObject json = new JSONObject(jsonText);
return json;
} finally {
is.close();
}
}
private void toJava(JSONObject obj) throws Exception {
Gson gson = new Gson();
MapsRoute m = gson.fromJson(readJsonFromUrl(urlBuilder()).toString(),
MapsRoute.class);
System.out.println(m);
}
}
MapsRoute.java
public class MapsRoute {
@SerializedName("routes")
public List<String> routes;
@SerializedName("copyrights")
public String copyrights;
@SerializedName("legs")
public List<String> legs;
@SerializedName("steps")
public List<String> steps;
}
我肯定我误解了一些简单的事情,非常感谢您的指导
这是Google地图试图解析的url,我正在成功地接收它,因为我可以在我的readfromurl方法中对其进行搜索
编辑:这是调用readsFromUrl(urlBuilder())时的输出
09-2419:57:03.879:I/System.out(4068):
{“状态”:“确定”,“路线”:[{“航路点\顺序”:
[],“概述”:“A2”,“边界”:{“西南”:{“液化天然气”:-0.1262498,“纬度”:50.918706699999},
“东北”:{“lng”:23.0020594,“lat”:52.4304362},“腿”:[{“持续时间”:{“值”:63803,“文本”:“17”
小时43分“}”,距离:{“值”:1825694,“文本”:“1826”
km“}”,结束位置:{“lng”:23.0020594,“lat”:51.5038920999999},“开始地址”:“70”
伦敦白厅
SW1A 2AS,英国,“结束地址”:“Orzechów-Kolonia 2,21-109
奥泽科洛尼亚,
波兰,“起始位置”:{“lng”:-0.1262498,“lat”:51.5034032},“通过航路点”:[],“步骤”:[{“html_指令”:“头部”
白厅宫殿北面/白厅/A3212朝向
马卫大街,“持续时间”:{“值”:17,“文本”:“1”
最小“}”,距离:{“值”:157,“文本”:“0.2”
km“}”,终点位置:{“lng”:-0.1265332,“lat”:51.504799200001},“多段线”:{“点”:“ggjyHtW]@cADYD[DUBWFy@PWD},“行驶模式”:“驾驶”,“开始位置”:{“lng”:-0.1262498,“lat”:51.5034032}},{“html_指令”:“转弯”
马上到马卫那里去
平均值,持续时间:{“值”:53,“文本”:“1”
最小“}”,距离:{“值”:242,“文本”:“0.2”
km“}”,终点位置:{“lng”:-0.1231268,“lat”:51.504648900001},“多段线”:{“点”:“{pjyHxuWC]Ei@IgAAQAOAMAK橡木?M?M?K?I?I@I?M@S
@wEPeBBY“},“开始位置”:{“lng”:-0.1265332,“lat”:51.5047992000001},“机动”:“右转”,“行驶模式”:“驾驶”},{“html\U说明”:“转弯”
就在维多利亚
路堤/A3211,“持续时间”:{“值”:49,“文本”:“1”
最小“}”,距离:{“值”:389,“文本”:“0.4”
km“}”,终点位置:{“lng”:-0.1239744,“lat”:51.5011942},“多段线”:{“点”:“aojyHpWxH”~Ab@H
En@~@F@?b@Bl@@“}”,开始位置:{“lng”:-0.1231268,“lat”:51.504648900001},“机动”:“右转”,“行驶模式”:“驾驶”},{“html_指令”:“转弯”
左转入威斯敏斯特桥路/A302离开收费区
区域“,”持续时间“:{”值“:62,“文本“:”1
最小“}”,距离:{“值”:507,“文本”:“0.5”
km“}”,终点位置:{“lng”:-0.1170572,“纬度”:51.50053550000001},“多段线”:{“点”:”myiyHxeW@ABABCB?DADCBABCBC@CBEBI?K@E@G@GBw@@}@@qA@q@DkFFkF?KFuAFgAEYC[Ai@?]@g@@iA?u2;?O@U@Q@KBMBGBGP[FM”},“开始位置”:{“lng”:-0.1239744,“lat”:51.5011942},“机动”:“左转”,“行驶模式”:“驾驶”},{“html_说明”:“轻微”
左转停留在威斯敏斯特桥路/A302离开收费站
区域“,”持续时间“:{”值“:4,“文本“:”1
最小“}”,距离:{“值”:26,“文本”:“26”
m“},“端点位置”:{“lng”:-0.1167459,“lat”:51.5004276},“多段线”:{“点”:”kuiyHrzUFIBEBG@G@G@G?M“},“开始位置”:{“lng”:-0.1170572,“lat”:51.50053550000001},“机动”:“轻微左转”,“行驶模式”:“驾驶”},{“html_说明”:“转弯”
左,留在威斯敏斯特桥上
Rd/A302,“持续时间”:{“值”:4,“文本”:“1”
最小“}”,距离:{“值”:23,“文本”:“23”
m“},“结束位置”:{“lng”:-0.1165272,“lat”:-51.5005834},“多段线”:{“点”:“Utiyhtxuikimik”},“开始位置”:{“lng”:-0.1167459,“lat”:-51.5004276},“机动”:“左转”,“行驶模式”:“驾驶”},{“html\U指令”:“轻微”
在威斯敏斯特大桥停留的权利
Rd/A302,“持续时间”:{“值”:10,“文本”:“1”
最小“}”,距离:{“值”:52,“文本”:“52”
m“},“端点位置”:{“lng”:-0.1158714,“lat”:51.5007879},“多段线”:{“点”:”suiyHhwUEa@GUGQQc@AE?G?G“},“开始位置”:{“lng”:-0.1165272,“lat”:51.5005834},“机动”:“稍微向右转弯”,“行驶模式”:“驾驶”},{“html_说明”:“转弯”
在威斯敏斯特桥路/A302上停留的权利继续沿着威斯敏斯特桥行驶
长途电话
区域,“持续时间”:{“值”:93,“文本”:“2”
分钟“}”,距离:{“值”:848,“文本”:“0.8”
km“}”,终点位置:{“lng”:-0.1051152,“纬度”:51.498740299999},“多段线”:{“点”:viyHdsU@EBG@E@CBEBCFGNQBMFMLYZm@b@o@d@o@FUDKd@oAXe@Vs@~@iCN[DKFKDGBGJYb@_B\mBRiAHa@BO@我?G@E?G@UBe@@]克莫伊亚奥?K?G??EGyAAe@EoAIwCKyCEoAAa@GiBIc@CQCW},“开始位置”:{“lng”:-0.1158714,“lat”:51.5007879},“机动”:“右转”,“行驶模式”:“DR”
嘿,Java对象与json的映射是不正确的
示例:routes有边界、分支、版权、步骤,而不是上面代码中映射的方式。不看任何东西,
期望一个字符串,但BEGIN\u OBJECT
对您意味着什么?调试并显示您从readJsonFromUrl()返回的json
。它似乎不是一个有效的JSon对象。或者至少对您的解析器无效。@SotiriosDelimanolis nothing这就是我寻求帮助的原因:)谷歌搜索表明这是因为我的字符串数据结构错误,但其他示例似乎使用了我的设置。我认为您应该停止正在执行的所有操作并进行检查。您不能期望JSon对象要映射到Java字符串的ct
@Narmer在调试过程中添加了sys。请简要说明正确的方法。定义路由类、绑定类、步骤类、腿部类。路由类有绑定类的对象、步骤类、字符串类型的版权、腿部类的对象。现在您将其用作大纲。确定了吗应该有一个公共列表路由,然后路由应该为其他每个部分都有列表?建议:尝试使用与json中相同的名称。这样会减少混淆和更好地理解。它很容易映射。但是我的方法正确吗?路由包含边界、版权和legs对象。legs对象包含steps对象等?
09-24 19:22:47.367: W/System.err(1720): com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 27
09-24 19:22:47.367: W/System.err(1720): at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:176)
09-24 19:22:47.367: W/System.err(1720): at com.google.gson.Gson.fromJson(Gson.java:803)
09-24 19:22:47.367: W/System.err(1720): at com.google.gson.Gson.fromJson(Gson.java:768)
09-24 19:22:47.367: W/System.err(1720): at com.google.gson.Gson.fromJson(Gson.java:717)
09-24 19:22:47.367: W/System.err(1720): at com.google.gson.Gson.fromJson(Gson.java:689)
09-24 19:22:47.367: W/System.err(1720): at boyle.matt.runrouter.TestJSON.toJava(TestJSON.java:119)
09-24 19:22:47.367: W/System.err(1720): at boyle.matt.runrouter.TestJSON.access$2(TestJSON.java:117)
09-24 19:22:47.371: W/System.err(1720): at boyle.matt.runrouter.TestJSON$1.run(TestJSON.java:47)
09-24 19:22:47.371: W/System.err(1720): at java.lang.Thread.run(Thread.java:856)
09-24 19:22:47.371: W/System.err(1720): Caused by: java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 27
09-24 19:22:47.371: W/System.err(1720): at com.google.gson.stream.JsonReader.nextString(JsonReader.java:821)
09-24 19:22:47.371: W/System.err(1720): at com.google.gson.internal.bind.TypeAdapters$13.read(TypeAdapters.java:358)
09-24 19:22:47.371: W/System.err(1720): at com.google.gson.internal.bind.TypeAdapters$13.read(TypeAdapters.java:346)
09-24 19:22:47.371: W/System.err(1720): at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40)
09-24 19:22:47.371: W/System.err(1720): at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:81)
09-24 19:22:47.371: W/System.err(1720): at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:60)
09-24 19:22:47.371: W/System.err(1720): at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93)
09-24 19:22:47.371: W/System.err(1720): at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172)
09-24 19:22:47.371: W/System.err(1720): ... 8 more