Java 使用 getJSONObject(int)

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/23703431/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-14 00:48:25  来源:igfitidea点击:

Use getJSONObject(int)

javaandroidjson

提问by AquaMorph

I'm trying to parse some JSON. Here is the code. frc-manual.usfirst.org/a/GetAllItems/ManualID=3I have been trying for several hours to get it work but every example I have seen online uses getJSONObject(int) but I can only use getJSONObject(String). This is making impossible. Am I overlooking something?

我正在尝试解析一些 JSON。这是代码。frc-manual.usfirst.org/a/GetAllItems/ManualID=3我已经尝试了几个小时来让它工作,但我在网上看到的每个例子都使用 getJSONObject(int) 但我只能使用 getJSONObject(String)。这是不可能的。我是否忽略了什么?

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

import android.annotation.SuppressLint;

public class JSON {
   private String html = "html";
   private String version = "version";
   private String pageString = null;
   private String urlString = "http://frc-manual.usfirst.org/a/GetAllItems/ManualID=3";

   public volatile boolean parsingComplete = true;
   public JSON(String page){
      this.pageString = page;
   }
   public String getHTML(){
      return html;
   }
   public String getVersion(){
      return version;
   }

   @SuppressLint("NewApi")
   public void readAndParseJSON(String in) {
      try {
         JSONObject reader = new JSONObject(in);

         JSONObject head = reader.getJSONObject("data").getJSONObject("SubChapter").getJSONObject("3").getJSONObject("children").getJSONObject(pageString);
         if(head != null){
             html = head.getString("item_content_text");
             html = html + head.length();
             for(int i = 0; i < head.length();i++){
                 JSONObject children = head.getJSONObject(i);
                 if(children != null){
                     html = html + children.getString("item_content_text");
                 }

             } 
         }

         //html = html + listFromJsonSorted(head.getJSONObject("children"));





         JSONObject main  = reader.getJSONObject("data");
         version = main.getString("LatestManualUpdate");

         parsingComplete = false;



        } catch (Exception e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
        }

   }
   public void fetchJSON(){
      Thread thread = new Thread(new Runnable(){
         @Override
         public void run() {
         try {
            URL url = new URL(urlString);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setReadTimeout(10000 /* milliseconds */);
            conn.setConnectTimeout(15000 /* milliseconds */);
            conn.setRequestMethod("GET");
            conn.setDoInput(true);
            // Starts the query
            conn.connect();
         InputStream stream = conn.getInputStream();

      String data = convertStreamToString(stream);

      readAndParseJSON(data);
         stream.close();

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

       thread.start();      
   }
   static String convertStreamToString(java.io.InputStream is) {
      java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\A");
      return s.hasNext() ? s.next() : "";
   }

}

回答by Rajat Singhal

You are only able to use getJSONObject(String)not getJSONObject(int)because the method only takes String.. Check documentation here..

您只能使用getJSONObject(String)notgetJSONObject(int)因为该方法仅采用 String ..在此处查看文档..

The reason that is the because the keys in json are always strings only.. read here

原因是因为 json 中的键始终只是字符串..在这里阅读

I think you are looking to retrieve an int value from the json but you got confused.. The way to do that would be getInt("key_name")if the json indeed has a key with int value..

我认为您正在寻找从 json 中检索 int 值,但您感到困惑.. 这样做的方法是getInt("key_name")如果 json 确实有一个带有 int 值的键..

回答by Tiago Henrique Engel

Probably what you are seeing in this example is a JSONArray.

您在本示例中看到的可能是 JSONArray。

JSONArray arr = json.getJSONArray("array");
JSONObject obj = arr.getJSONObject(0);

In your case, i don't see any array in this JSON, headin your code is a JSONObject. To get the item_content_text you just need head.getString("item_content_text");

在你的情况下,我在这个 JSON 中没有看到任何数组,你的代码中的头部是一个 JSONObject。要获得您只需要的 item_content_texthead.getString("item_content_text");

You can do this to get all childrens in your JSON:

您可以这样做以获取 JSON 中的所有子项:

html = head.getString("item_content_text");
JSONObject children = head;
while (children.containsKey("children")) {
   children = children.getJSONObject("children");
   html += children.getString("item_content_text");
}

回答by ND27

Sure you can, just that I think your "head" variable should have a return type of JSONArray instead of JSONObject.

当然可以,只是我认为你的“头”变量应该有一个 JSONArray 而不是 JSONObject 的返回类型。

I have this code running in my program -

我在我的程序中运行了这段代码 -

    //response = some http response
    final JSONObject object = new JSONObject(response);
    final JSONArray array = object.getJSONArray("repeatedStuff"); //$NON-NLS-1$
    Assert.assertEquals(2, array.length());
    for (int i = 0; i < array.length(); i++) {
        final JSONObject element = array.getJSONObject(i);
        //do something
    }

Also you may refer this link to see what they are doing - android: The method getJSONObject(int) in the type JSONArray is not applicable for the arguments (String)

您也可以参考此链接以查看他们在做什么 - android:JSONArray 类型中的方法 getJSONObject(int) 不适用于参数 (String)

Let me know if that helped!

如果有帮助,请告诉我!