我正在尝试将此JSON字符串划分为每个联系人项目的单个字符串,例如emailAddress&电话号码。我正在使用System.out.print来查看信息是否存储在字符串中。 system.out中没有显示任何内容,所有发生的事情都是您在logcat中看到的内容。
JSON字符串:
{"items":[{"description":"payment confirmed","emailAddress":"abc@aqw.com","id":"Fri Aug 30 17:20:35 EDT 2013","nameFirst":"Bill","nameLast":"Sanders","phone":"5555555555","state":"KS","streetAddress":"123 Rick Dr","zipCode":"44444","kind":"contactinfoendpoint#resourcesItem"},{"description":"payment confirmed","emailAddress":"qwe@msn.com","id":"Fri Aug 30 17:21:37 EDT 2013","nameFirst":"Frank","nameLast":"Lloyd","phone":"5554567896","state":"KY","streetAddress":"999 Rock St","zipCode":"44555","kind":"contactinfoendpoint#resourcesItem"}],"kind":"contactinfoendpoint#resources","etag":"\"NiDXI3T89oRrAPGJAhgGQje1Z0w/z0W4p01mjHc5cNgcOt3Kb_1xo8E\""}
这是logcat。
09-03 14:51:18.755: W/System.err(27991): org.json.JSONException: No value for emailAddress
09-03 14:51:18.755: W/System.err(27991): at org.json.JSONObject.get(JSONObject.java:354)
09-03 14:51:18.755: W/System.err(27991): at org.json.JSONObject.getString(JSONObject.java:510)
09-03 14:51:18.755: W/System.err(27991): at com.indeeditis.FinderActivity$EndpointsTask.doInBackground(FinderActivity.java:112)
09-03 14:51:18.765: W/System.err(27991): at com.indeeditis.FinderActivity$EndpointsTask.doInBackground(FinderActivity.java:1)
09-03 14:51:18.765: W/System.err(27991): at android.os.AsyncTask$2.call(AsyncTask.java:287)
09-03 14:51:18.765: W/System.err(27991): at java.util.concurrent.FutureTask.run(FutureTask.java:234)
09-03 14:51:18.765: W/System.err(27991): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
09-03 14:51:18.765: W/System.err(27991): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
09-03 14:51:18.765: W/System.err(27991): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
09-03 14:51:18.765: W/System.err(27991): at java.lang.Thread.run(Thread.java:856)
我的节目:
public class FinderActivity extends ListActivity {
private static final String TAG_ID = "id";
private static final String TAG_FIRSTNAME = "nameFirst";
private static final String TAG_LASTNAME = "nameLast";
private static final String TAG_EMAIL = "emailAddress";
private static final String TAG_ADDRESS = "streetAddress";
private static final String TAG_STATE = "state";
private static final String TAG_PHONE = "phone";
JSONArray contacts = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
new EndpointsTask().execute(getApplicationContext());
}
public class EndpointsTask extends AsyncTask<Context, Integer, Long> {
public Long doInBackground(Context... contexts) {
Contactinfoendpoint.Builder endpointBuilder = new Contactinfoendpoint.Builder(
AndroidHttp.newCompatibleTransport(),
new JacksonFactory(),
new HttpRequestInitializer() {
public void initialize(HttpRequest httpRequest) { }
});
Contactinfoendpoint endpoint = CloudEndpointUtils.updateBuilder(
endpointBuilder).build();
try {
String apples = endpoint.listContactInfo().execute().toString();
JSONObject jObject = new JSONObject(apples);
JSONArray jsonArr = jObject.getJSONArray("items");
for(int i =0 ; i<jsonArr.length() ;i++ ){
JSONObject jsonObj1 = jsonArr.getJSONObject(i);
// Storing each json item in variable
String id = jsonObj1.getString(TAG_ID);
String nameFirst1 = jsonObj1.getString(TAG_FIRSTNAME);
String nameLast1 = jsonObj1.getString(TAG_LASTNAME);
String emailAddress1 = jsonObj1.getString(TAG_EMAIL);
String streetAddress1 = jsonObj1.getString(TAG_ADDRESS);
String phone1 = jsonObj1.getString(TAG_PHONE);
//test to see if made it to string
System.out.print(nameFirst1);
System.out.print(nameLast1);
}
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return (long) 0;
}
}
}
您在logcat中的标记。在循环之前验证字符串的内容。
09-03 15:13:57.690: D/YOUR_TAG(30179): [{"streetAddress":"123 Rick Dr","id":"Fri Aug 30 17:20:35 EDT 2013","phone":"5555555555","nameLast":"Sanders","nameFirst":"Bill","description":"payment confirmed","zipCode":"44444","state":"KS","emailAddress":"abc@aqw.com","kind":"contactinfoendpoint#resourcesItem"},{"streetAddress":"999 Rock St","id":"Fri Aug 30 17:21:37 EDT 2013","phone":"5554567896","nameLast":"Lloyd","nameFirst":"Frank","description":"payment confirmed","zipCode":"44555","state":"KY","emailAddress":"qwe@msn.com","kind":"contactinfoendpoint#resourcesItem"},{"id":"Sat Aug 31 12:46:33 EDT 2013","nameLast":"j","nameFirst":"j","kind":"contactinfoendpoint#resourcesItem","description":"payment confirmed"},{"id":"Sat Aug 31 14:33:03 EDT 2013","emailAddress":"c","nameLast":"b","nameFirst":"a","kind":"contactinfoendpoint#resourcesItem","description":"payment confirmed"}]
好的,我已从我的数据存储中删除了以后的条目。我现在没有收到任何错误,但我没有得到任何我想要的系统输出。
答案 0 :(得分:1)
看起来您正在假设数组中每个对象的数据。其中一个对象没有每一个数据,这是一个错误。我猜你的错误就在以下一行中:
String id = jsonObj1.getString(TAG_ID);
String nameFirst1 = jsonObj1.getString(TAG_FIRSTNAME);
String nameLast1 = jsonObj1.getString(TAG_LASTNAME);
String emailAddress1 = jsonObj1.getString(TAG_EMAIL);
String streetAddress1 = jsonObj1.getString(TAG_ADDRESS);
String phone1 = jsonObj1.getString(TAG_PHONE);
由于您没有看到任何打印内容,因此设置断点并在首次进入for循环时验证每个数据是否实际存在。另外,我建议做一些防御性编码并使用has()来验证jsonObject实际上是否有数据,然后再尝试抓取它,这样你以后就不会得到这些堆栈跟踪。像
这样的东西String id = "";
if (jsonObj1.has(TAG_ID)) {
id = jsonObj1.getString(TAG_ID);
} else {
///Handle bad data
}
答案 1 :(得分:1)
您可以使用droidQuery来简化解析:
Object[] array = $.makeArray(jsonArr);
for (Object obj : array)
{
Map<String, ?> map = $.map((JSONObject) obj);
for (Map.Entry<String, ?> entry : map)
{
Log.d("DEBUG", String.format(Locale.US, "Object contains Key %s and value %s", entry.getKey(), entry.getValue().toString());
}
}
答案 2 :(得分:1)
如您所见,您没有为第三个对象定义任何emailAddress。如果您不确定JSON中是否包含每个属性,则必须先检查密钥。
if (jsonObject.has(TAG)) {
jsonObject.getString(TAG_ID);
}
有些时候我使用utils来简化代码,例如:
public static String getString(JSONObject object, String tag, String defString) {
if (object.has(tag))
return object.getString(tag);
else
return defString;
}
所以我的代码看起来像这样:
String nameFirst1 = Utils.getString(jsonObj1, TAG_ID, ""); // your firstName default.
String nameLast1 = Utils.getString(jsonObj1, TAG_ID, null); // maybe null??
您的JSON已格式化,请使用此link查看格式化(这对我有很大帮助)
[
{
"streetAddress":"123 Rick Dr",
"id":"Fri Aug 30 17:20:35 EDT 2013",
"phone":"5555555555",
"nameLast":"Sanders",
"nameFirst":"Bill",
"description":"payment confirmed",
"zipCode":"44444",
"state":"KS",
"emailAddress":"abc@aqw.com",
"kind":"contactinfoendpoint#resourcesItem"
},
{
"streetAddress":"999 Rock St",
"id":"Fri Aug 30 17:21:37 EDT 2013",
"phone":"5554567896",
"nameLast":"Lloyd",
"nameFirst":"Frank",
"description":"payment confirmed",
"zipCode":"44555",
"state":"KY",
"emailAddress":"qwe@msn.com",
"kind":"contactinfoendpoint#resourcesItem"
},
{
"id":"Sat Aug 31 12:46:33 EDT 2013",
"nameLast":"j",
"nameFirst":"j",
"kind":"contactinfoendpoint#resourcesItem",
"description":"payment confirmed"
},
{
"id":"Sat Aug 31 14:33:03 EDT 2013",
"emailAddress":"c",
"nameLast":"b",
"nameFirst":"a",
"kind":"contactinfoendpoint#resourcesItem",
"description":"payment confirmed"
}
]
答案 3 :(得分:1)
我知道答案已被接受,您也可以考虑使用GSON库。
IT完全符合您的要求,并且有很多文档和示例,并且库甚至都有很好的文档记录:
https://code.google.com/p/google-gson/
http://www.javacreed.com/simple-gson-example/
希望这有助于您未来的项目。