Java Android-获取JSONArray问题

Java Android-获取JSONArray问题,java,android,json,Java,Android,Json,在我的android应用程序中,我想从网站获取JSON数据。 我创建它是为了获取具有以下结构的数据: [{"id":"1","name":"a"},{"id":"2","name":"a"},{"id":"3","name":"a"},{"id":"4","name":"a"}] {"ok":true,"license":"xx","data":"zz","status":"ok","stations": [{"id":"474","name":"ABC","street":"MARGARET

在我的android应用程序中,我想从网站获取JSON数据。 我创建它是为了获取具有以下结构的数据:

[{"id":"1","name":"a"},{"id":"2","name":"a"},{"id":"3","name":"a"},{"id":"4","name":"a"}]
{"ok":true,"license":"xx","data":"zz","status":"ok","stations":
[{"id":"474","name":"ABC","street":"MARGARETE-STR."},
{"id":"442","name":"XYZ","street":"ABCSTR"}]}
它的工作原理和它应该的一样完美。现在,我尝试稍微操纵代码以获取其他JSON数据。它具有以下结构:

[{"id":"1","name":"a"},{"id":"2","name":"a"},{"id":"3","name":"a"},{"id":"4","name":"a"}]
{"ok":true,"license":"xx","data":"zz","status":"ok","stations":
[{"id":"474","name":"ABC","street":"MARGARETE-STR."},
{"id":"442","name":"XYZ","street":"ABCSTR"}]}
我没有得到任何结果,我认为这可能是因为应该获取的数据位于数组中,但我也认为我无论如何都会得到它。我拿错了吗

我的代码:

public class MainActivity extends AppCompatActivity {

    List<GetDataAdapter> GetDataAdapter1;

    RecyclerView recyclerView;
    RecyclerView.LayoutManager recyclerViewlayoutManager;
    RecyclerView.Adapter recyclerViewadapter;
    ProgressBar progressBar;
    String GET_JSON_DATA_HTTP_URL = "xx.com";
    String JSON_ID = "id";
    String JSON_NAME = "name";
    String JSON_SUBJECT = "email";
    String JSON_STREET = "street";
    Button button;
    JsonArrayRequest jsonArrayRequest;
    com.android.volley.RequestQueue requestQueue;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        GetDataAdapter1 = new ArrayList<>();
        recyclerView = (RecyclerView) findViewById(R.id.recyclerView1);
        progressBar = (ProgressBar) findViewById(R.id.progressBar1);
        button = (Button) findViewById(R.id.button);
        recyclerView.setHasFixedSize(true);
        recyclerViewlayoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(recyclerViewlayoutManager);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                progressBar.setVisibility(View.VISIBLE);
                JSON_DATA_WEB_CALL();
            }
        });
    }

    public void JSON_DATA_WEB_CALL() {

        jsonArrayRequest = new JsonArrayRequest(GET_JSON_DATA_HTTP_URL,

                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray response) {

                        progressBar.setVisibility(View.GONE);
                        JSON_PARSE_DATA_AFTER_WEBCALL(response);
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {

                    }
                });

        requestQueue = Volley.newRequestQueue(this);
        requestQueue.add(jsonArrayRequest);
    }

    public void JSON_PARSE_DATA_AFTER_WEBCALL(JSONArray array) {

        for (int i = 0; i < array.length(); i++) {

            GetDataAdapter GetDataAdapter2 = new GetDataAdapter();

            JSONObject json = null;
            try {
                json = array.getJSONObject(i);

                GetDataAdapter2.setId(json.getInt(JSON_ID));
                GetDataAdapter2.setName(json.getString(JSON_NAME));
                GetDataAdapter2.setStreet(json.getString(JSON_STREET));

            } catch (JSONException e) {

                e.printStackTrace();
            }
            GetDataAdapter1.add(GetDataAdapter2);
        }
        recyclerViewadapter = new RecyclerViewAdapter(GetDataAdapter1, this);
        recyclerView.setAdapter(recyclerViewadapter);
    }
}
public类MainActivity扩展了AppCompatActivity{
列出GetDataAdapter1;
回收视图回收视图;
RecyclerView.LayoutManager recyclerViewlayoutManager;
适配器RecycleWebAdapter;
ProgressBar ProgressBar;
字符串GET\u JSON\u DATA\u HTTP\u URL=“xx.com”;
字符串JSON_ID=“ID”;
字符串JSON_NAME=“NAME”;
字符串JSON_SUBJECT=“email”;
字符串JSON_STREET=“STREET”;
按钮;
JsonArrayRequest JsonArrayRequest;
com.android.volley.RequestQueue请求队列;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
GetDataAdapter1=新的ArrayList();
recyclerView=(recyclerView)findViewById(R.id.RecyclerViewW1);
progressBar=(progressBar)findViewById(R.id.progressBar1);
按钮=(按钮)findViewById(R.id.button);
recyclerView.setHasFixedSize(true);
recyclerViewlayoutManager=新的LinearLayoutManager(此);
recyclerView.setLayoutManager(recyclerViewlayoutManager);
setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
progressBar.setVisibility(View.VISIBLE);
JSON_DATA_WEB_CALL();
}
});
}
public void JSON_DATA_WEB_CALL(){
jsonArrayRequest=新的jsonArrayRequest(获取JSON数据、HTTP URL、,
新的Response.Listener(){
@凌驾
公共void onResponse(JSONArray响应){
progressBar.setVisibility(View.GONE);
JSON在WEBCALL之后解析数据(响应);
}
},
新的Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
}
});
requestQueue=Volley.newRequestQueue(this);
add(jsonArrayRequest);
}
public void JSON\u解析\u数据\u WEBCALL之后(JSONArray数组){
对于(int i=0;i
第二个JSON示例不是JSON数组;它是一个JSON对象。您应该使用
JsonObjectRequest
而不是
JsonArrayRequest
来获取此数据。

第一个对象是JSONObject而不是JSONArray,您可以使用JSONObject.getJSONArray(“stations”)获取数组。请使用Java命名约定,就像您打破它的地方一样,使代码更难阅读。谢谢您的建议。那么,我会调用
onResponse
中的特定对象get方法吗?我不能在现有的ArrayRequest中使用它吗?不,您必须按照下面的回答使用JsonObjectRequest,然后您将收到onResponse(JSONObjectObj obj)。此obj包含字段(ok、License和其他)“stations”将是对象的一个字段,它是一个JSONArrayAh,所以我需要将它作为一个对象来处理,甚至可以得到“station”,然后我可以像以前一样使用它作为数组?确切地说,你在添加的第二个示例中得到一个JSONObject,然后从它内部得到一个JSONArray,它作为名为“stations”的字段,这些括号
{}
您正在定义对象吗?我只想获取这些括号中的内容,或者这与您提到的问题相同?正确,
{}
表示对象,
[]
表示数组。不过,您仍然需要处理整个响应。您需要将响应作为对象读取,然后使用
response.getJSONArray(“stations”)
感谢您向我展示我的问题,我找到了解决方案!