检查json对象是否包含特定值

时间:2018-05-12 04:41:22

标签: android json

我有一个json数据列出所有音阶及其键。

这就是它的样子:

Scales Json

或代码视图:

{
  "allScalesJson": [
    {
      "scale": "A Major",
      "keys": [
        "b",
        "a",
        "e",
        "d",
        "gs",
        "fs",
        "cs"
      ]
    },
    {
      "scale": "B Major",
      "keys": [
        "b",
        "e",
        "as",
        "gs",
        "fs",
        "ds",
        "cs"
      ]
    },
    {
      "scale": "D Major",
      "keys": [
        "b",
        "a",
        "g",
        "e",
        "d",
        "fs",
        "cs"
      ]
    }
  ]
}

我正在尝试创建一个方法,将keys作为参数并返回包含这些键的所有比例。

基于以上json数据的示例:

List<String> returned_scales = findScalesThatContainThisKeys(Arrays.asList("a","d"));

输出:

  

A Major,D Major

这是:

private List<String> findScalesThatContainThisKeys(List<String> keys_array){
    List<String> foundedScales = new ArrayList<>();
    try {
        JSONObject jsonObj = new JSONObject(loadJSONFromAsset());
        JSONArray rootElement = jsonObj.getJSONArray("allScalesJson");
        for (int i = 0; i < rootElement.length(); i++) {
            JSONObject obj = rootElement.getJSONObject(i);

            String scale = obj.getString("scale");

            // Keys is json array
            JSONArray genreArray = obj.getJSONArray("keys");
            ArrayList<String> keys = new ArrayList<>();
            for (int j = 0; j < genreArray.length(); j++) {
                // TODO: 5/12/2018
            }
        }
    }catch (Exception e){e.printStackTrace();}


    return foundedScales;
}

4 个答案:

答案 0 :(得分:1)

尝试使用for循环。

  private List<String> findScales(List<String> keys_array){
        List<String> foundedScales = new ArrayList<>();
        try {
            JSONObject jsonObj = new JSONObject(loadJSONFromAsset());
            JSONArray rootElement = jsonObj.getJSONArray("allScalesJson");
            ArrayList<String> scales_found = new ArrayList<>();

            for (int i = 0; i < rootElement.length(); i++) {
                JSONObject obj = rootElement.getJSONObject(i);

                String scale = obj.getString("scale");

                // Keys is json array
                JSONArray genreArray = obj.getJSONArray("keys");
                boolean all_found = true;

                for(String key: keys_array){
                   boolean found_this_key = false;
                   for (int j = 0; j < genreArray.length(); j++) {
                      if(key.equals(genreArray.getString(j))){
                          found_this_key = true;
                          break;
                      }
                   }
                   if(!found_this_key){
                        all_found = false;
                        break;
                   }
                }

                if(all_found){
                    scales_found.add(scale);
                }
            }

            return scales_found;
        }catch (Exception e){e.printStackTrace();}


        return foundedScales;
    }

答案 1 :(得分:1)

使用此代码:

这将忽略大写或小写问题。为此,所有字符串都应在一种情况下转换(大写/小写)

答案 2 :(得分:0)

试试这个, 使用Hashmap并按键获取

public class MainActivity extends AppCompatActivity {


    private RequestQueue mRequestQueue;
    private StringRequest mStringRequest;
    private String url = "url";

    JSONArray jsonArray;

    HashMap<String, String> meMap=new HashMap<String, String>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mRequestQueue = Volley.newRequestQueue(this);
        //String Request initialized
        mStringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {


                try {
                    JSONObject jsonObject = new JSONObject(response);
                    jsonArray = jsonObject.getJSONArray("allScalesJson");
                    for (int i = 0; i <jsonArray.length() ; i++) {

                        jsonObject = jsonArray.getJSONObject(i);

                        meMap.put(jsonObject.getString("scale"),jsonObject.getString("keys"));

                    }

                    Toast.makeText(MainActivity.this, meMap.toString(), Toast.LENGTH_SHORT).show();
                    Toast.makeText(MainActivity.this, meMap.get("A Major"), Toast.LENGTH_SHORT).show();
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {

            }
        });
        mRequestQueue.add(mStringRequest);


    }
}

答案 3 :(得分:0)

更新您的代码,如下所示

private List<String> findScales(List<String> keys_array){ 
    List<String> foundedScales = new ArrayList<>(); 
    try { 
            JSONObject jsonObj = new JSONObject(loadJSONFromAsset());       

            JSONArray rootElement = jsonObj.getJSONArray("allScalesJson"); 
            for (int i = 0; i < rootElement.length(); i++) { 
                 JSONObject obj = rootElement.getJSONObject(i); 
                 String scale = obj.getString("scale"); // Keys is json array 
                JSONArray genreArray = obj.getJSONArray("keys");  
                ArrayList<String> keys = new ArrayList<>(); 
                for (int j = 0; j < genreArray.length(); j++) { 
                      if(keys_array.contains(genreArray.get(i)){
                        foundedScales.add(scale);
                     }
                } 
            } 
        }catch (Exception e) {
             e.printStackTrace();
        } 
    return foundedScales; 
}