2012-04-17 107 views
1

我有以下字符串作为HTTPResponse。它采用JSON格式。JSON对象分析错误

[ 
    { 
     "From":"en", 
     "OriginalTextSentenceLengths":[ 
      5 
     ], 
     "TranslatedText":"Hallo", 
     "TranslatedTextSentenceLengths":[ 
      5 
     ] 
    }, 
    { 
     "From":"en", 
     "OriginalTextSentenceLengths":[ 
      8 
     ], 
     "TranslatedText":"Frage", 
     "TranslatedTextSentenceLengths":[ 
      5 
     ] 
    }, 
    { 
     "From":"en", 
     "OriginalTextSentenceLengths":[ 
      6 
     ], 
     "TranslatedText":"Antwort", 
     "TranslatedTextSentenceLengths":[ 
      7 
     ] 
    } 
] 

所以这个字符串我解析如下,以获得“翻译文本阵”

String resp = "[{\"From\":\"en\",\"OriginalTextSentenceLengths\":[5],\"TranslatedText\":\"Hallo\",\"TranslatedTextSentenceLengths\":[5]},{\"From\":\"en\",\"OriginalTextSentenceLengths\":[8],\"TranslatedText\":\"Frage\",\"TranslatedTextSentenceLengths\":[5]},{\"From\":\"en\",\"OriginalTextSentenceLengths\":[6],\"TranslatedText\":\"Antwort\",\"TranslatedTextSentenceLengths\":[7]}]"; 

    String[] stringArray = null; 
    try { 
    JSONArray finalResult=null; 
    JSONTokener tokener = new JSONTokener(resp); 

     finalResult = new JSONArray(tokener); 
     stringArray = new String[finalResult.length()]; 

    for(int i=0;i<finalResult.length();i++){ 
     JSONObject e = finalResult.getJSONObject(i); 
     Log.v("TAG",e.getString("TranslatedText")); 
     stringArray[i]=e.getString("TranslatedText"); 
    }   

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

我正在提取“翻译文本”阵列(喂,FRAGE,Antwort)出来的JSON对象...

但是当我通过获取的HttpResponse如下之后给予相同的字符串输入到JSONTokener即直接做同样的程序,我越来越JSON异常在finalResult =新JSONArray(tokener)线。 ...

org.json.JSONException:在

String resp = getHttpResponse(uri); 
String[] stringArray = null; 
    try { 
    JSONArray finalResult=null; 
    JSONTokener tokener = new JSONTokener(resp); 

     finalResult = new JSONArray(tokener); 
     stringArray = new String[finalResult.length()]; 

    for(int i=0;i<finalResult.length();i++){ 
     JSONObject e = finalResult.getJSONObject(i); 
     Log.v("TAG",e.getString("TranslatedText")); 
     stringArray[i]=e.getString("TranslatedText"); 
    } 

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

字符输入0结束我已经很努力了2天,解决这个错误,但不能这样做。所以我张贴在这里...请帮助

编辑:

我加入getHttpResponse

实施
public static String getHttpResponse(URI uri) { 
    Log.d("APP_TAG", "Going to make a get request"); 
    StringBuilder response = new StringBuilder(); 
    try { 
     HttpGet get = new HttpGet(); 
     get.setURI(uri); 
     //DefaultHttpClient httpClient = new DefaultHttpClient(); 
     HttpParams httpParameters = new BasicHttpParams(); 
     int timeoutConnection = 30000; 
     HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection); 
     int timeoutSocket = 30000; 
     HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); 

     DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters); 

     Log.v("TAG","1"); 
     HttpResponse httpResponse = httpClient.execute(get); 
     Log.v("TAG","2"); 
     if (httpResponse.getStatusLine().getStatusCode() == 200) { 
      Log.d("demo", "HTTP Get succeeded"); 

      HttpEntity messageEntity = httpResponse.getEntity(); 
      InputStream is = messageEntity.getContent(); 
      BufferedReader br = new BufferedReader(new InputStreamReader(is)); 
      String line; 
      while ((line = br.readLine()) != null) { 
       response.append(line); 
      } 
     } 
    } catch (Exception e) { 
     Log.e("demo", e.getMessage()); 
    } 
    Log.d("demo", "Done with HTTP getting"); 
    return response.toString(); 
} 

和我所赐给getHttpResponse URI是如下

String[] texts = {"hello","question","answer"}; 
    final String params = "appId=" + URLEncoder.encode("78280AF4DFA1CE1676AFE86340C690023A5AC139","UTF-8")     
      + "&from=" + URLEncoder.encode("en","UTF-8")     
      + "&to=" + URLEncoder.encode("de","UTF-8")     
      + "&texts=" + URLEncoder.encode(buildStringArrayParam(texts),"UTF-8");     

    final URL url = new URL("http://api.microsofttranslator.com/V2/Ajax.svc/TranslateArray?" + params);  

    URI myURI = java.net.URI.create(url.toString()); 
    String resp = getHttpResponse(myURI); 

此响应字符串就是我试图解析...

这是buildStringArrayParam(文本)

StringBuilder targetString = new StringBuilder("[\""); 
    String value; 
    for(Object obj : values) { 
     if(obj!=null) { 
      value = obj.toString(); 
      if(value.length()!=0) { 
       if(targetString.length()>2) 
        targetString.append(",\""); 
       targetString.append(value); 
       targetString.append("\""); 
      } 
     } 
    } 
    targetString.append("]"); 
    return targetString.toString(); 
+0

如果您从'getHttpResponse()'记录'resp'字符串,它实际上是否包含您期望的JSON字符串? – 2012-04-17 10:32:35

+0

是的,它包含我期望的JSON字符串... – DSP 2012-04-17 10:37:07

+0

你是否用'equals()'检查了它,比较它的'String resp =“[{\”From \“:\”...'constant?你可以添加从'getHttpResponse()'得到的'resp'给你问题吗? – 2012-04-17 12:02:37

回答

3

Ahaha ...微软。

至少在这种情况下,他们所服务的API响应与(不正确的?)FEFF FEFF UTF-16 byte order mark在打破大多数客户开始。

the PHP guys over here already found out一样,您只需从响应中去掉前两个字节。对于〔实施例在代码:

JSONTokener tokener = new JSONTokener(resp.substring(2)); 

恐怕更无害trim()不起作用。

这真的很难找到,因为FEFF的官方名称是“零宽度不间断空间”,所以它是完全不可见的,除非您将字符串视为字符数组或注意文本光标在移动时如何停止使用左/右箭头键的字符串...

请注意,您不应该对您收到的任何其他HTTP响应执行此操作,这仅适用于此Microsoft API(也可能是其他人)。

+0

嗨,现在得到一个新的异常.... org.json.JSONException:Value {“TranslatedText”:“Hallo”,“TranslatedTextSentenceLengths”:[ 5],“OriginalTextSentenceLengths”:[5],“From”:“en”}的类型org.json.JSONObject无法转换为JSONArray – DSP 2012-04-18 13:08:03

+0

这发生在JSONTokener tokener = new JSONTokener(resp.substring(2)); line ... – DSP 2012-04-18 13:18:03

+1

改用'substring(1)'来代替。我不确定它是否适用于我,因为API有时会返回不同的物料清单或者我的测试用例出错。 – 2012-04-18 13:41:24

0

尝试使用这样的:

HttpPost request = new HttpPost(URL); 
HttpResponse response = httpClient.execute(request); 

HttpEntity httpEntity = response.getEntity(); 
InputStream content = httpEntity.getContent(); 

BufferedReader reader = new BufferedReader(new InputStreamReader(content,"iso-8859-1"),8); 
String resp = reader.readLine(); 

现在“响应”将举行它可以解析的字符串...

+0

其实问题不在于HttpResponse,因为我正确地得到了响应字符串,并且我在logcat中显示了它...我在第一个代码中使用了该字符串,它发挥作用... – DSP 2012-04-17 10:07:25

+0

您的URL支持POST/GET HTTP方法?再次检查! – Pallavi 2012-04-17 10:10:20

+0

它支持GET,因为我已经得到了我在开始发布的响应... – DSP 2012-04-17 10:16:30

2

Try GSON

并试图改变你的代码的设计,希望它会帮助你。从URL

和检索内容 -

public static String getContent(String url) throws Exception { 
    return(new Scanner(new URL(url).openConnection().getInputStream()).useDelimiter("/z").next()); 
} 

玩得开心......

+0

我可以使用GSON,但是主要的问题是,当JSON解析在第一部分中工作时,为什么它在第二部分中失败? – DSP 2012-04-17 11:28:28

0
After getting the HTTP Response you have to do this thing, you cant use Httpresponse directly. 

HttpResponse response= null; 
response = http.execute(get); 
HttpEntity entity = response.getEntity(); 
String xmlstring = EntityUtils.toString(entity); 
message = xmlstring; 
+0

我使用了字符串生成器,并在得到响应后将其转换为字符串... – DSP 2012-04-17 11:25:43