2013-02-02 127 views
2

我试图解析位于http://api.pathofexile.com/ladders/Default?offset=0&limit=1的JSON。Android JSON解析器

{ 
"total": 15000, 
"entries": [ 
    { 
     "online": false, 
     "rank": 1, 
     "character": { 
      "name": "Byrr", 
      "level": 85, 
      "class": "Shadow", 
      "experience": 1397076236 
     }, 
     "account": { 
      "name": "Canoobians" 
     } 
    } 
] 
} 

我一直在关注的androidhive tutorial在试图修改它以检索“在线”和“等级”的元素。 (最后我想所有大量条目的元素,但我开始只有这两个试着去了解的东西。

public class AndroidJSONParsingActivity extends ListActivity { 

// url to make request 
private static String url = "http://api.pathofexile.com/ladders/Default?offset=0&limit=2"; 

// JSON node names 
private static final String TAG_ENTRIES = "entries"; 
private static final String TAG_ONLINE = "online"; 
private static final String TAG_RANK = "rank"; 

// entries JSONArray 
JSONArray entries = null; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    // Hashmap for ListView 
    ArrayList<HashMap<String, String>> entriesList = new ArrayList<HashMap<String, String>>(); 

    // create JSON Parser instance 
    JSONParser jParser = new JSONParser(); 

    // getting JSON string from url 
    JSONObject json = jParser.getJSONFromUrl(url); 

    try { 
     // Getting Array of entries 
     entries = json.getJSONArray(TAG_ENTRIES); 

     // looping through entries 
     for (int i = 0; i < entries.length(); i++) { 
      JSONObject ent = entries.getJSONObject(i); 

      // storing each JSON item in a variable 
      String online = ent.getString(TAG_ONLINE); 
      String rank = ent.getString(TAG_RANK); 

      // creating new HashMap 
      HashMap<String, String> map = new HashMap<String, String>(); 

      // adding each child node to HashMap key => value 
      map.put(TAG_ONLINE, online); 
      map.put(TAG_RANK, rank); 

      // adding HashList to ArrayList 
      entriesList.add(map); 
     } 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 

    // Updating parsed JSON data into ListView 
    ListAdapter adapter = new SimpleAdapter(this, entriesList, R.layout.list_item, new String[] { TAG_ONLINE, TAG_RANK }, new int[] { R.id.online, R.id.rank }); 
    setListAdapter(adapter); 

我JSONParser()类是作为教程一样。现在,当我运行程序出现错误:

Error parsing data org.json.JSONException: Value <!DOCTYPE of type java.lang.String cannot be converted to JSONObject. 

我不知道为什么这个错误发生的事情,因为JSON根据JSONLint是有效的,所以应该不会发送任何HTML,正确的有没有?我错过的东西,甚至是完全不同的/更好的方法来提取JSON?任何踢向正确的方向将不胜感激。

编辑:我不能回答自己还因为我是一个新用户,但事实证明,我得到一个在JSONParser(),我没有看到过NullPointerException,并且使用HttpGet(),而不是HttpPost()解决了我问题。

谢谢。

+0

我都是学习编写解析器,但已经检查过现有的JSON解析器是否适合这项工作?我最喜欢的一直是GSON,并在我的Android项目中为我服务。这对你来说至少要维护一件事。 – OEP

+0

也许你应该指出你得到的错误? –

回答

1

事实证明,我得到一个在JSONParser()NullPointerException,我没有看到过,并使用HttpGet(),而不是HttpPost()解决我的问题。

1

看这句话在JSONParser

BufferedReader reader = new BufferedReader(new InputStreamReader(
         is, "iso-8859-1"), 8); 

网站返回这个头

Content-Type: text/html; charset=UTF-8 

你必须在BufferedReader中ISO-8859-1改为UTF-8。

+0

谢谢,但androidhive网站使用的是UTF-8,而不是我试图解析的JSON,这是iso-8859-1。改变它确实引起我注意到我之前没有看到的NullPointerException。在JSONParser中将HttpPost更改为HttpGet修复了一切,但我不完全确定它是什么。 – Jophess