我有一个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;
}
答案 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;
}