LOG*_*TAG 5 parsing android gson
我正在尝试解析像这样的JSON字符串(使用http://www.json-generator.com生成的URL )
{
"total": 86,
"jsonrpc": "2.0",
"id": 1,
"result": [
{
"startDate": "14/03/2012",
"meetingId": "1330",
"creator": "Jhon",
"lastModified": "02/04/2012",
"meetingTitle": "task clarification",
"location": "Conf hall",
"startTime": "02:00 PM",
"createdDate": "14/03/2012",
"owner": "Peter",
"endTime": "02:30 PM"
},
{
"startDate": "20/03/2012",
"meetingId": "1396",
"creator": "Mr.Hobbs",
"lastModified": "07/09/2012",
"meetingTitle": "Design Work",
"location": "South conf Room",
"startTime": "03:30 PM",
"createdDate": "19/03/2012",
"owner": "Steve Jobs",
"endTime": "04:30 PM"
},
{
"startDate": "22/03/2012",
"meetingId": "1432",
"creator": "Robin",
"lastModified": "21/03/2012",
"meetingTitle": "Do something new",
"location": "NA",
"startTime": "10:00 AM",
"createdDate": "21/03/2012",
"owner": "Mr.Bean",
"endTime": "11:00 AM"
}
]
Run Code Online (Sandbox Code Playgroud)
}
这是我正在使用的对象类:
public class Country {
String startDate;
String meetingId;
String creator;
String lastModified;
String meetingTitle;
String location;
String startTime;
String createdDate;
String owner;
String endTime;
public String getStartDate() {
return startDate;
}
public void setStartDate(String startDate) {
this.startDate = startDate;
}
public String getMeetingId() {
return meetingId;
}
public void setMeetingId(String meetingId) {
this.meetingId = meetingId;
}
public String getCreator() {
return creator;
}
public void setCreator(String creator) {
this.creator = creator;
}
public String getLastModified() {
return lastModified;
}
public void setLastModified(String lastModified) {
this.lastModified = lastModified;
}
public String getMeetingTitle() {
return meetingTitle;
}
public void setMeetingTitle(String meetingTitle) {
this.meetingTitle = meetingTitle;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public String getStartTime() {
return startTime;
}
public void setStartTime(String startTime) {
this.startTime = startTime;
}
public String getCreatedDate() {
return createdDate;
}
public void setCreatedDate(String createdDate) {
this.createdDate = createdDate;
}
public String getOwner() {
return owner;
}
public void setOwner(String owner) {
this.owner = owner;
}
public String getEndTime() {
return endTime;
}
public void setEndTime(String endTime) {
this.endTime = endTime;
}
}
Run Code Online (Sandbox Code Playgroud)
但它让我失望:
W/JSONStreamReader(1153): java.lang.IllegalStateException: Expected a name but was NUMBER at line 1 column 8
08-09 01:21:37.629: W/JSONStreamReader(1153): java.lang.IllegalStateException: Expected a name but was NUMBER at line 1 column 8
08-09 01:21:37.629: W/JSONStreamReader(1153): at com.google.gson.stream.JsonReader.nextName(JsonReader.java:785)
08-09 01:21:37.629: W/JSONStreamReader(1153): at com.example.gsontest.MainActivity$MyAsyncTask.doInBackground(MainActivity.java:162)
Run Code Online (Sandbox Code Playgroud)
在Json"id":1,是数字!那是什么原因?我正在使用http://www.json-generator.com生成JSON
我解析Json的Aysc代码:
private class MyAsyncTask extends AsyncTask<String, Void, Void> {
private static final int REGISTRATION_TIMEOUT = 3 * 1000;
private static final int WAIT_TIMEOUT = 30 * 1000;
private final HttpClient httpclient = new DefaultHttpClient();
final HttpParams params = httpclient.getParams();
private boolean error = false;
protected Void doInBackground(String... urls) {
String URL = null;
Log.d("ConnManagerParams", "ok?");
try {
// URL passed to the AsyncTask
URL = urls[0];
HttpConnectionParams.setConnectionTimeout(params,
REGISTRATION_TIMEOUT);
HttpConnectionParams.setSoTimeout(params, WAIT_TIMEOUT);
ConnManagerParams.setTimeout(params, WAIT_TIMEOUT);
Log.d("ConnManagerParams", "ok?");
HttpPost httpPost = new HttpPost(URL);
Log.d("httpPost", "ok?");
// Response from the Http Request
HttpResponse response = httpclient.execute(httpPost);
Log.d("response", "ok?");
// Check the Http Request for success
StatusLine statusLine = response.getStatusLine();
Log.d("statusLine", response.getStatusLine().toString());
// Log.d("RESPONSE",
// EntityUtils.toString(response.getEntity()));
if (statusLine.getStatusCode() == HttpStatus.SC_OK) {
// Log.d("statusok", statusLine.getStatusCode());
Gson gson = new Gson();
// create a new JSON reader from the response input stream
Log.d("gson", "gson?");
JsonReader jsonReader = new JsonReader(
new InputStreamReader(response.getEntity()
.getContent(), "UTF-8"));
// begin parsing
Log.d("AFTjsonReader", "AFTjsonReader?");
jsonReader.beginObject();
Log.d("beginObject", "beginObject?");
// stay in loop as long as there are more data elements
while (jsonReader.hasNext()) {
// get the element name
Log.d("whilejsonReader", "whilejsonReader?");
// String name = jsonReader.nextName();
Log.d("nextName", jsonReader.nextName());
String name = jsonReader.nextName();
Log.d("nextNametest2", "nextName?");
if (name.equals("result")) {
Log.d("result", "result?");
jsonReader.beginArray();
while (jsonReader.hasNext()) {
// parse every element and convert that to a
// country object
Country country = gson.fromJson(jsonReader,
Country.class);
// add the country object to the list
countryList.add(country);
}
jsonReader.endArray();
}
// success = jsonReader.nextBoolean();
success = true;
}
// end reader and close the stream
jsonReader.endObject();
jsonReader.close();
} else {
// Closes the connection.
Log.d("Closes the connection.", "Closes the connection.?");
Log.w(LOG_TAG, statusLine.getReasonPhrase());
response.getEntity().getContent().close();
throw new IOException(statusLine.getReasonPhrase());
}
} catch (Exception e) {
Log.d("catch", "catch");
Log.w(LOG_TAG, e);
error = true;
cancel(true);
}
return null;
}
protected void onCancelled() {
Log.e(LOG_TAG, "Error occured during data download");
}
protected void onPostExecute(Void unused) {
if (error) {
Log.e(LOG_TAG, "Data download ended abnormally!");
} else {
displayCountries();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
任何想法我该如何解决?
谢谢!
Dan*_*ato 10
您的代码中的问题是您循环名称(json键):
while (jsonReader.hasNext()) {
Run Code Online (Sandbox Code Playgroud)
你得到了下一个名字:
String name = jsonReader.nextName();
Run Code Online (Sandbox Code Playgroud)
但是,只有当此名称等于时,才会使用该值result
.
可以把它想象JsonReader
成一种在json中向前移动光标的方法:通过令牌读取它.您给它的每个命令都可以读取光标指向的内容或移动光标,有时您可以移动光标并使用单个命令读取值(如同nextName()
).
当名字是不是result
该jsonReader
留在你离开它的位置:你刚才读的名称或关键nextName()
.
因此,下一次调用nextName()
从键将光标移动到值(next
),并希望找到一个name
,而是它发现以前的名称的价值,你的情况NUMBER
,因为在你的JSON的第一个值是一个数字(名称:"total"
,价值:) 56
.
如果你因为不关心它而没有读到这个值,你应该打电话
jsonReader.skipValue();
Run Code Online (Sandbox Code Playgroud)
意思是你应该改变你的代码
if (name.equals("result")) {
// read it
} else {
jsonReader.skipValue();
}
Run Code Online (Sandbox Code Playgroud)
也就是说:您应该使用注释,或者,如果由于某种原因不能使用注释,则可以注册一个或多个TypeAdapter
用于解析自定义对象的工作.
这些适配器中的代码与您编写的代码非常相似,但它仅限于与您的对象匹配的json的单个部分.
例如,如果您创建一个CountriesResult
包含您的类型total
和result
类型的类List<Country>
public class CountriesResult {
private int total;
@SerializedName("result")
private List<Country> countries;
}
Run Code Online (Sandbox Code Playgroud)
您已经拥有Country所需的字段类.
然后你要求GSon解析你的CountriesResult
对象,它会自动解析它.
gson.fromJson(jsonString, CountriesResult.class);
Run Code Online (Sandbox Code Playgroud)
如果您需要以Country
自定义方式解析,只需要TypeAdatper
for Country
,请参阅此示例.并注册类型适配器或使用@JsonAdapter
注释.
归档时间: |
|
查看次数: |
15949 次 |
最近记录: |