2014-05-16 4 views
1

Я пытаюсь разобрать некоторый JSON. Вот код. frc-manual.usfirst.org/a/GetAllItems/ManualID=3 Я пробовал несколько часов, чтобы заставить его работать, но каждый пример, который я видел в Интернете, использует getJSONObject (int), но я могу использовать только getJSONObject (String). Это делает невозможным. Я что-то пропускаю?Использование getJSONObject (int)

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() : ""; 
    } 

} 

ответ

0

Вы можете использовать getJSONObject(String) не getJSONObject(int), поскольку метод принимает только строки .. Проверить documentation here только ..

Причина, по которой это потому, что ключи в JSON всегда являются строками только .. read here

Я думаю, что вы ищете, чтобы получить целочисленное значение из JSON, но вы запутались .. способ сделать это было бы getInt("key_name"), если действительно имеет JSON ключ с Int значением ..

1

Возможно, что вы видите в этом примере JSONArray.

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

В вашем случае, я не вижу в этом массив JSON, голову в вашем коде является JSONObject. Чтобы получить item_content_text вам просто нужно head.getString("item_content_text");

Вы можете сделать это, чтобы получить все детско в вашем формате JSON:

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

Да, но мне также нужно, чтобы в дочерних узлах – AquaMorph

+0

, но вы уже получили дочерний узел в своем коде, я не вижу больше детей в JSON, которые вы отправили в качестве примера. –

+0

Думаю, я понимаю вашу проблему, вы можете иметь объект, у которого есть дети, которые могут иметь детей, и так далее. Поэтому вы можете это сделать. JSONObject children = head.getJSONObject ("children"); if (children! = null) concat –

0

Конечно, вы можете, просто я думаю, что ваша переменная «голова» должна иметь тип возвращаемого JSONArray вместо JSONObject.

У меня есть этот код работает в моей программе -

//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 
    } 

Также вы можете сослаться на эту ссылку, чтобы увидеть, что они делают - android: The method getJSONObject(int) in the type JSONArray is not applicable for the arguments (String)

Позвольте мне знать, если это помогло!

+0

Он хочет, чтобы я менял JSONArray обратно в JSONObject – AquaMorph

+0

, вы пробовали листинг типа (JSONArray) из Object? – ND27

+0

Чтобы ответить на ваш первоначальный вопрос - да, это возможно, если вы перебираете JSONObjects из JSONArray. – ND27

Смежные вопросы