如何正确从 url 读取 JSON 数组数据

Posted

技术标签:

【中文标题】如何正确从 url 读取 JSON 数组数据【英文标题】:how can i read JSON array data from url correctly 【发布时间】:2020-08-02 03:32:00 【问题描述】:

我正在尝试使用 VOLLEY 将 json 数据从 url 解析到我的应用程序 这是我的 JSON:


  "code": 200,
  "status": "OK",
  "data": 
    "number": 1,
    "name": "سُورَةُ ٱلْفَاتِحَةِ",
    "englishName": "Al-Faatiha",
    "englishNameTranslation": "The Opening",
    "revelationType": "Meccan",
    "numberOfAyahs": 7,
    "ayahs": [
      
        "number": 1,
        "text": "بِسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ",
        "numberInSurah": 1,
        "juz": 1,
        "manzil": 1,
        "page": 1,
        "ruku": 1,
        "hizbQuarter": 1,
        "sajda": false
      ,
      
        "number": 2,
        "text": "الْحَمْدُ لِلَّهِ رَبِّ الْعَالَمِينَ",
        "numberInSurah": 2,
        "juz": 1,
        "manzil": 1,
        "page": 1,
        "ruku": 1,
        "hizbQuarter": 1,
        "sajda": false
      ,
      
        "number": 3,
        "text": "الرَّحْمَٰنِ الرَّحِيمِ",
        "numberInSurah": 3,
        "juz": 1,
        "manzil": 1,
        "page": 1,
        "ruku": 1,
        "hizbQuarter": 1,
        "sajda": false
      ,
      
        "number": 4,
        "text": "مَالِكِ يَوْمِ الدِّينِ",
        "numberInSurah": 4,
        "juz": 1,
        "manzil": 1,
        "page": 1,
        "ruku": 1,
        "hizbQuarter": 1,
        "sajda": false
      ,
      
        "number": 5,
        "text": "إِيَّاكَ نَعْبُدُ وَإِيَّاكَ نَسْتَعِينُ",
        "numberInSurah": 5,
        "juz": 1,
        "manzil": 1,
        "page": 1,
        "ruku": 1,
        "hizbQuarter": 1,
        "sajda": false
      ,
      
        "number": 6,
        "text": "اهْدِنَا الصِّرَاطَ الْمُسْتَقِيمَ",
        "numberInSurah": 6,
        "juz": 1,
        "manzil": 1,
        "page": 1,
        "ruku": 1,
        "hizbQuarter": 1,
        "sajda": false
      ,
      
        "number": 7,
        "text": "صِرَاطَ الَّذِينَ أَنْعَمْتَ عَلَيْهِمْ غَيْرِ الْمَغْضُوبِ عَلَيْهِمْ وَلَا الضَّالِّينَ",
        "numberInSurah": 7,
        "juz": 1,
        "manzil": 1,
        "page": 1,
        "ruku": 1,
        "hizbQuarter": 1,
        "sajda": false
      
    ],
    "edition": 
      "identifier": "quran-simple",
      "language": "ar",
      "name": "Simple",
      "englishName": "Simple",
      "format": "text",
      "type": "quran",
      "direction": "rtl"
    
  

我想显示“ayahs”数组,但只显示“文本”对象 将它们放入string 并使用intent 将它们发送到另一个activity 并在textView 中显示它们 请帮帮我

这是我的解析方法

public String[] parseJSON()

    final String[] myText=new String[6];
    String url = "http://api.alquran.cloud/v1/surah/1";

    JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
            new Response.Listener<JSONObject>() 
                @Override
                public void onResponse(JSONObject response) 

                    try 
                        JSONObject jsonObject=response.getJSONObject("data");
                        JSONArray jsonArray=jsonObject.getJSONArray("ayahs");
                        for(int i=0;i==jsonArray.length();i++)

                            JSONObject aya=jsonArray.getJSONObject(i);
                            String text=aya.getString("text");

                            myText[i] =text;

                        


                     catch (JSONException e) 
                        e.printStackTrace();
                    

                
            , new Response.ErrorListener() 
        @Override
        public void onErrorResponse(VolleyError error) 
            error.printStackTrace();

        
    );
    mRequestQueue.add(request);


    return myText;

这是我的意图发送方法

public void onItemClick(int position) 

    //ExampleItem clickedItem = mExampleList.get(position);
    // final int sorahNumber=++position;


    Intent detailIntent = new Intent(this, DetailActivity.class);
    String[] myText = parseJSON();
    detailIntent.putExtra("text", myText);
    startActivity(detailIntent);



这是我的意图捕捉器

public class DetailActivity extends AppCompatActivity 

    private TextView sorah_tv;
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_detail);


        sorah_tv=findViewById(R.id.sorah_tv);

        Intent intent=getIntent();
        String[] text=intent.getStringArrayExtra("text") ;
        for(int i=0;i<text.length;i++)

            sorah_tv.setText(text[i]);
        

请帮帮我

【问题讨论】:

将您的 json 数据粘贴到您的问题中。 完成,感谢您通知我 能否获取数组中的数据? 【参考方案1】:

我的猜测是循环是错误的,而不是这个:

for(int i=0;i==jsonArray.length();i++)

JSONObject aya=jsonArray.getJSONObject(i);
String text=aya.getString("text");

myText[i] =text;


这样做:

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

JSONObject aya=jsonArray.getJSONObject(i);
String text=aya.getString("text");

myText[i] =text;


更新:

我认为您收到错误 OutOfBoundException,因为 JSON 数组中有 7 个对象,而 myText 数组的大小为 6:

所以不要这样:

final String[] myText=new String[6];

这样做:

final String[] myText=new String[7];

【讨论】:

以上是关于如何正确从 url 读取 JSON 数组数据的主要内容,如果未能解决你的问题,请参考以下文章

PHP如何把数据写入JSON文件并在另一PHP文件读取JSON数据?

编写 SwiftUI 模型以从带有数组的 JSON 文件中读取

如何从 HttpURLConnection 读取 json 数据

Vue.js - 如何将 prop 作为 json 数组传递并在子组件中正确使用?

尝试读取解析的 JSON 数组时索引超出范围

从特定 url 读取数据 json