3

オブジェクトのリストを返すWCFサービスを利用しようとするAndroidアプリがあります。ストリームは正しく読み取られますが、文字列をJSONArrayに変換しようとすると、空のJSONExceptionがスローされます。JSONバリデーターでJSON応答を確認しましたが、この継ぎ目は問題ありません。

私のWCFサービス契約:

   [ServiceContract]
   public interface IAndroidWebService
    {
        [OperationContract]
        [WebGet(UriTemplate = "AndroidGetTenants",
            BodyStyle = WebMessageBodyStyle.WrappedRequest,
            ResponseFormat = WebMessageFormat.Json,
            RequestFormat = WebMessageFormat.Json)]
        List<TenantEntity> AndroidGetTenants();
    }

呼び出されたときに生成されるJSON応答:

[{"MaxVotesPerSecond":0,"Name":"Duurzaam OV","PartitionKey":"a63569b9-e794-4674-832b-46e85de0dc0a","RowKey":"02f1654c-9746-4da5-a146-bff7fe611468"},
    {"MaxVotesPerSecond":0,"Name":"Overheid","PartitionKey":"e38f3d93-5b4d-41e9-8513-3fd350a019af","RowKey":"11ec2c3e-e65f-45cf-9c89-4aa40a2c21c7"}]

私のアプリで使用されているJavaコード:

HttpGet request = new HttpGet("http://XX.XX/WebService.svc/Android/AndroidGetTenants");        
request.setHeader("Accept", "application/json");        
request.setHeader("Content-type", "application/json");  

DefaultHttpClient httpClient = new DefaultHttpClient();        
HttpResponse response = httpClient.execute(request);       
HttpEntity responseEntity = response.getEntity();         

byte[] buffer = new byte[(int)responseEntity.getContentLength()];        
InputStream stream = responseEntity.getContent();  
stream.read(buffer);
stream.close();  
String tekst = new String(buffer,"UTF-8");                          
JSONArray tenants = new JSONArray(tekst);  

Javaコードは空のJSONExceptionをスローします(catchのパラメーターeは存在しません)。サービスはオブジェクトの配列を返すようです。私が変更したとき:

JSONArray tenants = new JSONArray(tekst); 

JSONObject tenants = new JSONObject(tekst); 

コードはJSONException: Value [{"RowKey":"02f1654c-9746-4da5 ...... esPerSecond":0}] of type org.json.JSONArray cannot be converted to JSONObject

これはJSONArrayを使用することを示していますが、これも上記の空の例外をスローします。

誰かが助けてくれることを願っています。


追加情報:このコードも同じ例外をスローします:

String tekst = "[\"1\",\"2\"]";                         
JSONArray tenants = new JSONArray(tekst); 

これは単純なJSON配列であり、なぜこれが機能しないのか本当にわかりません。

4

1 に答える 1

0

最初に、フレームワーク内のパーサーのすべてのストリーム監視コードを変更することをお勧めします。これにより、応答ブロックは次のようになります。

HttpResponse response = httpClient.execute(request);           
String tekst = EntityUtils.toString( response.getEntity() );

これにより、サーバーからすべての正しいデータを取得し、適切にフォーマットすることが保証される場合があります。読者が文字を引き下げる方法に何かがあるのか​​もしれません。

于 2012-07-16T19:54:34.357 に答える