简体   繁体   English

使用双方值解析JSON

[英]Parse JSON with both sides values

I'm using volley to get response from API but the response consist of STATE_ID:STATE_NAME pair (ie value:value pair) and I need both side's values in different Strings. 我正在使用volley来获取API的响应,但响应包含STATE_ID:STATE_NAME对(ie value:value pair) ,我需要不同字符串中的两个值。 I need these values to put in a spinner so that when user selects a State I can get its corresponding ID also. 我需要将这些值放入微调器中,以便当用户选择State我也可以获得相应的ID。

// JSON response
{
  "1": "West bengal",
  "3": "Himachal Pradesh",
  "4": "Maharashtra",
  "11": "Queensland"
}

My Code 我的守则

public class MainActivity extends AppCompatActivity {

    private static final String STATE = "MY_API";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void login(View v){
        loginRequest();
    }
    private void loginRequest() {

        StringRequest stringRequest = new StringRequest(Request.Method.POST, STATE,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {

                        Toast.makeText(MainActivity.this, response, Toast.LENGTH_SHORT).show();
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(getApplicationContext(), "VolleyError" + error.toString(), Toast.LENGTH_LONG).show();
            }
        }) {
            @Override
            protected Map<String, String> getParams() {
                Map<String, String> params = new HashMap<String, String>();
                params.put("country_id","2");
                return params;
            }

        };

        RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
        requestQueue.add(stringRequest);
    }
}

You already have the iterate() method as we discussed in comments. 你已经有了我们在评论中讨论过的iterate()方法。

Done some work to give you value : 做了一些工作来给你价值:

try {
        JSONObject jsonObject = new JSONObject(response);

        for (String key : iterate(jsonObject.keys()))
        {
            Toast.makeText(this, "Key : "+key+" Value: "+jsonObject.optString(key), Toast.LENGTH_SHORT).show();
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }

Please refer the iterate method from this answer . 请参考此答案中iterate方法。 I have posted this as a new answer because OP was unable to make it for the values..!! 我发布了这个作为一个新的答案,因为OP无法为价值观做出准备.. !!

I used iterator to find a key. 我使用迭代器来查找密钥。 May this will help: 愿这有助于:

 private void parseRespone(String response){

try {

JSONObject MainjsonObject = new JSONObject(response)

Iterator<String> iter= MainjsonObject.keys();
//To get keys of an object

    while (iter.hasNext()) 
    {

    String key = (String)iter.next();

            //Object value = jsonobj.get(key);  //To use by object

        String valueStr = jsonobj.get.getString(key);


    Log.i("Jsonparsing", "key= "+key + "\n Value=" +valueStr );

    Toast.makeText(getActivity(),"key= "+ key + "\n value= " + valueStr ,Toast.LENGTH_SHORT).show();        

    }

    } catch (JSONException e) {
        e.printStackTrace();
    }catch (Exception e) {
        e.printStackTrace();
    }
}

I could find an unknown key by this. 我可以找到一个未知的密钥。 Please check in a Log in your android studio... here I have put Toast also.. 请登录你的Android工作室登录...在这里我也把Toast也放了..

And call this function here... 并在此处调用此函数...

...........
        @Override
                    public void onResponse(String response) {

            parseRespone(response);  //Function to parse json

                    }

Thanks.. 谢谢..

You can use jsonObject.names() (or keys() for an Iterator) to retrieve all keys. 您可以使用jsonObject.names() (或Iterator的keys() )来检索所有键。 After that you can iterate through the array using the keys and store your strings. 之后,您可以使用键遍历数组并存储字符串。

https://developer.android.com/reference/org/json/JSONObject.html#names() https://developer.android.com/reference/org/json/JSONObject.html#keys() https://developer.android.com/reference/org/json/JSONObject.html#names() https://developer.android.com/reference/org/json/JSONObject.html#keys()

It will be much better if you consider changing your response to something like this: 如果您考虑将响应更改为以下内容会更好:

[
  {"ID":"1","name": "West bengal"},
  {"ID":"3","name": "Himachal Pradesh"},
  {"ID":"4","name": "Maharashtra"},
  {"ID":"11","name": "Queensland"}
]

I tried this solution and it worked out.`Here, "key" will toast the key_value[1,3,4,11] and value will print the names[West bengal,Himachal Pradesh,Maharashtra,Queensland]. 我尝试了这个解决方案并且解决了问题。在这里,“关键”将向key_value [1,3,4,11]致敬,值将打印出名称[West bengal,Himachal Pradesh,Maharashtra,Queensland]。

JSONObject list_object = inner_json_object.getJSONObject(""); JSONObject list_object = inner_json_object.getJSONObject(“”);

                for (String key : iterate(list_object.keys()))
                {
                    // here key will be containing your OBJECT NAME YOU CAN SET IT IN TEXTVIEW.
                    Toast.makeText(Activity.this, ""+key, Toast.LENGTH_SHORT).show();
                    String value = bank_list_object.optString(key);


                }`



private <T> Iterable<T> iterate(final Iterator<T> i){
    return new Iterable<T>() {
        @Override
        public Iterator<T> iterator() {
            return i;
        }
    };
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM