这是我的JSON的片段,它很长,在“菜单”部分后,它会回到“位置”并重新开始。我不知道为什么但是我循环并将其打印到我的logcat它将停在“菜单”部分的随机位置并抛出错误。我不明白如何访问整个菜单部分。
{
"locations": [{
"Location": {
"id": "1",
"name": "Scott Express Cafe",
"building": "PKI",
"monday_hours": "8am-2:30pm",
"tuesday_hours": "8am-2:30pm",
"wednesday_hours": "8am-2:30pm",
"thursday_hours": "8am-2:30pm",
"friday_hours": "8am-2:30pm",
"saturday_hours": "Closed",
"sunday_hours": "Closed"
},
"Section": [{
"id": "3",
"location_id": "1",
"name": "Snacks",
"Location": {
"id": "1",
"name": "Scott Express Cafe",
"building": "PKI",
"monday_hours": "8am-2:30pm",
"tuesday_hours": "8am-2:30pm",
"wednesday_hours": "8am-2:30pm",
"thursday_hours": "8am-2:30pm",
"friday_hours": "8am-2:30pm",
"saturday_hours": "Closed",
"sunday_hours": "Closed"
},
"Menu": [{
"id": "278",
"location_id": "1",
"item_name": "Pop-tarts",
"price_small": "$1.00",
"price_medium": "",
"price_large": "",
"special": false,
"special_start": "",
"special_end": "",
"details": "",
"section_id": "3"
}, {
"id": "279",
"location_id": "1",
"item_name": "Cereal Bar",
"price_small": "$1.00",
"price_medium": "",
"price_large": "",
"special": false,
"special_start": "",
"special_end": "",
"details": "",
"section_id": "3"
},
以下是错误:
07-02 20:08:19.878: D/TAG_LOCATIONS(4597): },
07-02 20:08:19.878: D/TAG_LOCATIONS(4597): {
07-02 20:08:19.878: D/TAG_LOCATIONS(4597): "price_medium": "",
07-02 20:08:19.878: D/TAG_LOCATIONS(4597): "id": "295",
07-02 20:08:19.878: D/TAG_LOCATIONS(4597): "details": "",
07-02 20:08:19.878: D/TAG_LOCATIONS(4597): "price_large": "",
07-02 20:08:19.878: D/TAG_LOCATIONS(4597): "item_name": "Wheat Thins Toasted Chips",
07-02 20:08:19.878: D/TAG_LOCATIONS(4597): "special_end": "",
07-02 20:08:19.878: D/TAG_LOCATIONS(4597): "special_start": "",
07-02 20:08:19.878: D/TAG_LOCATIONS(4597): "section_id": "3",
07-02 20:08:19.878: D/TAG_LOCATIONS(4597): "special": false,
07-02 20:08:19.878: D/TAG_LOCATIONS(4597): "price_small": "$0.85",
07-02 20:08:19.878: D/TAG_LOCATIONS(4597): "location_id": "1"
07-02 20:08:19.878: D/TAG_LOCATIONS(4597): },
07-02 20:08:19.878: D/TAG_LOCATIONS(4597): {
07-02 20:08:19.878: D/TAG_LOCATIONS(4597): "pric
07-02 20:08:19.888: W/System.err(4597): org.json.JSONException: No value for id
07-02 20:08:19.908: W/System.err(4597): at o rg.json.JSONObject.get(JSONObject.java:354)
07-02 20:08:19.908: W/System.err(4597): at org.json.JSONObject.getString(JSONObject.java:510)
07-02 20:08:19.908: W/System.err(4597): at com.example.androidtablayout.FoodMenuList.onCreate(FoodMenuList.java:87)
07-02 20:08:19.908: W/System.err(4597): at android.app.Activity.performCreate(Activity.java:5104)
07-02 20:08:19.918: W/System.err(4597): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
07-02 20:08:19.918: W/System.err(4597): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
07-02 20:08:19.918: W/System.err(4597): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
07-02 20:08:19.918: W/System.err(4597): at android.app.ActivityThread.access$600(ActivityThread.java:141)
07-02 20:08:19.918: W/System.err(4597): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
07-02 20:08:19.928: W/System.err(4597): at android.os.Handler.dispatchMessage(Handler.java:99)
07-02 20:08:19.939: W/System.err(4597): at android.os.Looper.loop(Looper.java:137)
07-02 20:08:19.939: W/System.err(4597): at android.app.ActivityThread.main(ActivityThread.java:5041)
07-02 20:08:19.948: W/System.err(4597): at java.lang.reflect.Method.invokeNative(Native Method)
07-02 20:08:19.948: W/System.err(4597): at java.lang.reflect.Method.invoke(Method.java:511)
07-02 20:08:19.958: W/System.err(4597): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
07-02 20:08:19.958: W/System.err(4597): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
07-02 20:08:19.958: W/System.err(4597): at dalvik.system.NativeStart.main(Native Method)
我的班级:
public class FoodMenuList extends Activity {
// url to make request for menus
private static String url = "http://mavmate.atticdev.ist.unomaha.edu/api/v1/services/getMenus";
// JSON Node names
private static final String TAG_LOCATIONS = "locations";
private static final String TAG_LOCATION = "Location";
private static final String TAG_ID = "id";
private static final String TAG_NAME = "name";
private static final String TAG_BUILDING = "building";
// contacts JSONArray
JSONArray locations = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.foodmenulist_layout);
Bundle extras = getIntent().getExtras();
String locationIDThing = extras.getString("locationID");
// Hashmap for textView
ArrayList<HashMap<String, String>> menuItemList = new ArrayList<HashMap<String, String>>();
// Creating JSON Parser instance
JSONParser jParser = new JSONParser();
// getting JSON string from URL
JSONObject json = jParser.getJSONFromUrl(url);
try {
// Getting Array of locations
locations = json.getJSONArray(TAG_LOCATIONS);
// looping through All locations
for(int i = 0; i < locations.length(); i++){
JSONObject c = locations.getJSONObject(i);
Log.d("TAG_LOCATIONS", locations.toString(i));
// Storing each json item in variable
String id = c.getString(TAG_ID);
String name = c.getString(TAG_NAME);
String Location = c.getString(TAG_BUILDING);
String building = c.getString(TAG_LOCATION);
// creating new HashMap
HashMap<String, String> map = new HashMap<String, String>();
// adding each child node to HashMap key => value
map.put(TAG_ID, id);
map.put(TAG_NAME, name);
map.put(TAG_LOCATION, Location);
map.put(TAG_BUILDING, building);
//map.put(TAG_PHONE_MOBILE, mobile);
// adding HashList to ArrayList
menuItemList.add(map);
}
} catch (JSONException e) {
e.printStackTrace();
}
答案 0 :(得分:1)
不是手动解析JSON来获取数据,而是考虑使用GSON library从JSON反序列化Java对象。例如,以下内容将json字符串转换为Person对象。
Person p = gson.fromJson(jsonStr, Person.class)
答案 1 :(得分:0)
我认为您正在寻找JSON中错误位置的“id” “id”存在于“Location”或“Section”的元素
中但不是直接在“位置”的元素中,这是代码所在的位置。
编辑:
JSONObject json = jParser.getJSONFromUrl(url);
for (JSONObject jsonObj : json.getJSONArray("locations"))
for(JSONObject jsonObj2 : jsonObj.getJSONArray("Section"))
for(JSONObject jsonObj3 : jsonObj2.getJSONArray("Menu"))
System.out.println(jsonObj3.get("id");
考虑使用“optXXX”功能而不是“getXXX”,例如optString(“ID)