2011-04-29 121 views
2

嗨,大家好,我还是一般的Android相关编程和StackOverflow的noobot,所以对我来说不要太苛刻,但是我一直没能找到这样的问题。 : -/将JSON字符串转换为Java/Python(Jython)对象?

所以,我明白,你可以JSON字符串转换为字符串,并通过在Android中org.json束处理一般JSON对象,但这里是我目前的状况:

我需要一个JSON字符串从一个特定的URL(我已经能够成功地做到这一点),并将其制作成一个数组。实际上是两个数组。我使用的框架在Python上运行,并返回一个包含列表的字典(Python中的数组)。但是,它显示为JSON对象。这里是我从URL到我的Java代码的例子:

{"keywords": ["middle east", "syria"], "link": [["middle east", "http://www.google.com/#q=middle east"], ["syria", "http://www.google.com/#q=syria"]]} 

正如你所看到的,这是一个两个索引的字典。第一个是具有列表的“关键字”,第二个是包含列表列表的“链接”。这两个列表(第一个和第二个多维列表)是我希望能够在Java中操作的列表。我知道你可以使用JSONArray,但问题是数组存储在一个Python字典中,而我的Android应用程序没有正确地创建一个JSONArray。你们有什么想法可以解决这个问题吗?我很迷茫。这里是我得到实际的JSON字符串代码(代码中的网址是不是每个人都可以访问,它被送达贴在我的机器上):

static public void refreshFeed(){ 
    try{ 
     String url = "http://192.17.178.116:8080/getkw?nextline="+line; 
     line++; 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpGet httpget = new HttpGet(url); 
     HttpResponse response; 
     response = httpclient.execute(httpget); 
     HttpEntity entity = response.getEntity(); 
     InputStream in = entity.getContent(); 

     BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
     StringBuilder sb = new StringBuilder(); 

     String input = null; 
     try { 
      while ((input = reader.readLine()) != null) { 
      sb.append(input + "\n"); 
      } 
     } catch (IOException e) { 
       e.printStackTrace(); 
     } finally { 
      try { 
       in.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     String enter = sb.toString(); 
     feedEntry add = new feedEntry(enter); 
     addNewEntry(add); 
     in.close(); 

    } catch(MalformedURLException e){ 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

也请注意,这是没有的JSONString被制作成JSONArray。它只是将JSON对象转换为添加到“feedEntry”对象的常规字符串。

+1

不能确定Python的是什么,但偶然在这里... – 2011-04-29 04:06:17

+0

是的,可能是。只是想我会包括所有可能的信息,以便让大家充分理解发生了什么(如果有所作为)。 – Vinay 2011-04-29 04:23:34

回答

3

将python字典映射到json数组是更多的工作,比你期望的更多。最好把它变成一个json对象或者从一个列表开始,这个列表可以直接映射到一个json数组。 Info on serializing between python and java

这里就是我在Python中创建一个表结构,然后抓住它在Android应用程序中的代码示例:

#!/usr/bin/python 

print "Content-type: text/html\n\n" 

import json 
from collections import defaultdict 

mystuff = list() 
mystuff.append(('1', 'b', 'c', 'd')) 
mystuff.append(('2', 'f', 'g', 'h')) 

stufflist = list() 

for s in stufflist: 
    d = {} 
    d['a'] = s[0] 
    d['b'] = s[1] 
    d['c'] = s[2] 
    d['d'] = s[3] 
    stufflist.append(d) 

print json.write(stufflist) 

而在安卓

// Convert the string (sb is a string butter from the http response) to a json array. 
JSONArray jArray = new JSONArray(sb.toString()); 

for(int i = 0; i < jArray.length(); i++){ 
    // Get each item as a JSON object. 
    JSONObject json_data = jArray.getJSONObject(i); 

    // Get data from object ... 
    Int a = json_data.getInt("a"); 
    String b = json_data.getString("b"); 
    String c = json_data.getString("c"); 
    String d = json_data.getString("d"); 

    // Do whatever with the data ... 
} 
+0

如果您知道json数据的预期结构,那么生成它的内容并不重要(python或不)。你的Python代码是不正确的:1. s/for s in stufflist/for s in mystuff /'2. s/json.write /json.dumps/'3.'s /'(\ d)'/ $ 1/'如果你想使用'.getInt()'。你可以这样写:'print'json.dumps([dict(zip('abcd',s))in ['1bcd','2fgh']])'如果'a'应该是一个整数然后'print json.dumps([dict(zip('abcd',s))在[[1] + list('bcd'),[2] + list('fgh')]])' – jfs 2011-04-29 06:06:52

+0

我用了更多扩展表示法以使其更易于阅读,并且我的代码可以工作。 尽管生成对象的内容并不重要,但我的观点是,如果您从python字典创建json对象,它不会是有效的Java数组。 – Turnsole 2011-04-29 20:08:33

+0

谢谢你的及时响应绣球!对不起,这个问题不太快。我一直很忙。 – Vinay 2011-05-01 21:18:22