2017-07-16 113 views
0

我可以用这种方式从url解析json,我的json看起来像这样;Android从url解析json

[ 
    {"rank":1,"title":"The Shawshank Redemption"}, 
    {"rank":2,"title":"The Godfather"}, 
    {"rank":3,"title":"The Godfather: Part II"}, 
    {"rank":4,"title":"The Dark Knight"} 
] 

这是我的android代码,它的工作原理非常完美;

public class MainActivity extends AppCompatActivity { 

    private ListView listView; 
    private SwipeListAdapter adapter; 
    private List<Movie> movieList; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     listView = (ListView) findViewById(R.id.listView); 
     movieList = new ArrayList<>(); 
     adapter = new SwipeListAdapter(this, movieList); 
     listView.setAdapter(adapter); 
     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       fetchMovies(); 
      }; 
     }); 
    } 

    private void fetchMovies() { 
     String url = "http://www.url.com/test.json"; 
     JsonArrayRequest req = new JsonArrayRequest(url, 
       new Response.Listener<JSONArray>() { 
        @Override 
        public void onResponse(JSONArray response) { 
         if (response.length() > 0) { 
          for (int i = 0; i < response.length(); i++) { 
           try { 
            JSONObject movieObj = response.getJSONObject(i); 
            int rank = movieObj.getInt("rank"); 
            String title = movieObj.getString("title"); 
            Movie m = new Movie(rank, title); 
            movieList.add(0, m); 
           } catch (JSONException e) { 
           } 
          } 
          adapter.notifyDataSetChanged(); 
         } 
        } 
       }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_LONG).show(); 
      } 
     }); 
     MyApplication.getInstance().addToRequestQueue(req); 
    } 
} 

我想解析这个JSON,但我无法解析这个JSON,我不知道。

{ 
    "level":[ 
    { 
     "server":[ 
     {"rank":1,"title":"The Shawshank Redemption"}, 
     {"rank":2,"title":"The Godfather"}, 
     {"rank":3,"title":"The Godfather: Part II"}, 
     {"rank":4,"title":"The Dark Knight"} 
     ] 
    } 
    ] 
} 

我该怎么做?

谢谢。

+2

使用getJSONArray的级别和服务器...从顶部对象支架总是开始...不要太困难或不同于你有什么,但你需要一个JSON **对象**请求 –

+0

嗨@ cricket_007你能帮我吗?我做不到。 – Johny

回答

1

我强烈建议朝着Gson走。

这里是fetchMovies代码是你不想做出改变:

private void fetchMovies() { 
    String url = "http://www.url.com/test.json"; 
    JsonObjectRequest req = new JsonObjectRequest(url, null, 
      new Response.Listener<JSONObject>() { 
       @Override 
       public void onResponse(JSONObject response) { 
        try { 
         JSONArray level = response.getJSONArray("level"); 
         JSONObject item = level.getJSONObject(0); 
         JSONArray server = item.getJSONArray("server"); 
         for (int i = 0; i < server.length(); i++) { 
          try { 
           JSONObject movieObj = server.getJSONObject(i); 
           int rank = movieObj.getInt("rank"); 
           String title = movieObj.getString("title"); 
           Movie m = new Movie(rank, title); 
           movieList.add(0, m); 
          } catch (JSONException e) { 
          } 
         } 
         adapter.notifyDataSetChanged(); 
        } catch (JSONException e) { 
        } 
       } 
      }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_LONG).show(); 
     } 
    }); 
    MyApplication.getInstance().addToRequestQueue(req); 
} 
+2

Gson不会做网络请求 –

+1

当然不是,但它比手动解析json更好。你可以按照你想要的方式获取json。 –

+0

嗨@DiegoMarcher我试过你的代码,但有一个错误。你能检查图像吗?谢谢。 https://image.prntscr.com/image/sJ2yixBfTRCXEBbc5FFZXg.png – Johny