1

HTTPResponseとして次の文字列を取得しました。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();
    } 

JSONオブジェクトから抽出された「翻訳されたテキスト」配列(Hallo、Frage、Antwort)を取得しています...

しかし、JSONTokenerへの入力と同じ文字列を直接指定して同じ手順を実行している場合、つまり、以下のようにHttpResponseを取得した後、finalResult = new JSONArray(tokener)line...でJSON例外が発生します。

org.json.JSONException:の文字0での入力の終了

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

このエラーを解決するために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(texts)用です

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();
4

4 に答える 4

3

あはは...マイクロソフト。

少なくともこの場合、ほとんどのクライアントを壊す最初の(間違った?) FEFF FEFFUTF-16バイトオーダーマークでAPI応答を提供します。

ここにいるPHPの人たちがすでに知っているように、応答から最初の2バイトを取り除く必要があります。コードの例:

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

無害なほどtrim()うまくいかないのではないかと思います。

FEFFの正式名称は「ゼロ幅ノーブレークスペース」であるため、見つけるのは非常に困難です。文字列をchar配列として表示するか、左/右を使用して文字列内を移動するとテキストカーソルが停止することに気付かない限り、完全に非表示になります。矢印キー...

受け取った他のHTTP応答でこれを行うべきではないことに注意してください。これは、このMicrosoft API(おそらく他のAPI)のためだけのものです。

于 2012-04-18T11:51:19.760 に答える
2

GSONをお試しください

そして、コードのデザインを変更してみてください。それがお役に立てば幸いです。

そして、URLからコンテンツを取得します-

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

楽しむ...

于 2012-04-17T10:29:23.833 に答える
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();

これで、「resp」は解析可能な文字列を保持します。

于 2012-04-17T10:01:32.583 に答える
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;
于 2012-04-17T10:46:16.373 に答える