1

タイプ Contact( List )のリストを受け入れる ASP.NET で記述された Web サービスがあります。

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    #region List of contacts that need to be created in the database.
    public List<KeyValue> createRecordsInDb(List<Contact> dataToPass)
    {
        return Contact.insertArrayIntoDb(dataToPass);
    } 
    #endregion

Android デバイスでは、GSON ライブラリを使用してリスト文字列に変換しています。

    List<Contact> lstContactsToCreate= retrieveDataFromCursor(cursor,false);
    String jsonString = new Gson().toJson(lstContactsToCreate);
    try {
        callWebService(jsonString, _context.getResources().getString(R.string.updateCreateURL), false);
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (NotFoundException e) {
        e.printStackTrace();
    } catch (JSONException e) {
        e.printStackTrace();
    } catch (IOException e) {           
        e.printStackTrace();
    }

データをWebサービスに送信したいときに問題が発生します。次のメソッドでデータを渡しています。

private HttpResponse callWebService(String dataToPass, String URL, boolean isUpdate) 
        throws JSONException, ClientProtocolException, IOException{
    HttpPost httpPost = new HttpPost(URL);
    httpPost.setHeader("content-type", "application/json");

    HttpClient httpClient = new DefaultHttpClient(getHttpParameterObj(4000,4000));

    // Building the JSON object.
    JSONObject data = new JSONObject();
    data.put("dataToPass", dataToPass);

    StringEntity entity = new StringEntity(data.toString(), HTTP.UTF_8);

    entity.setContentType("application/json");
    entity.setContentEncoding( "UTF-8");

    httpPost.setEntity(entity);
    // Making the call.
    HttpResponse response = httpClient.execute(httpPost);
    return response;
}

Webサービスを呼び出すたびに、次のエラーがスローされます-

{"Message":"Cannot convert object of type \u0027System.String\u0027 to type \u0027System.Collections.Generic.List`1

問題は、次をdata.toString()返すことです:-

{"dataToPass":"[{\"address\":\"Himayath Nagar\",\"email\":\"abijeet.p@osmosys.asia\",\"name\":\"Abijeet Patro\",\"server_id\":\"\",\"status\":\"\"},{\"address\":\"himayath naga\",\"email\":\"saravana.e@osmosys.asia\",\"name\":\"Saravana\",\"server_id\":\"\",\"status\":\"\"},{\"address\":\"hellpo world\",\"email\":\"asshole@gmail.com\",\"name\":\"Syai\",\"server_id\":\"\",\"status\":\"\"}]"}

一方、Webサービスは次の形式のデータを期待しています

{"dataToPass":[{\"address\":\"Himayath Nagar\",\"email\":\"abijeet.p@osmosys.asia\",\"name\":\"Abijeet Patro\",\"server_id\":\"\",\"status\":\"\"},{\"address\":\"himayath naga\",\"email\":\"saravana.e@osmosys.asia\",\"name\":\"Saravana\",\"server_id\":\"\",\"status\":\"\"},{\"address\":\"hellpo world\",\"email\":\"asshole@gmail.com\",\"name\":\"Syai\",\"server_id\":\"\",\"status\":\"\"}]}

私はそれらの「」をそのまま置き換えて削除しようとさえしました:-

data.toString().replace("\"[","[").replace("]\"","]");
     (java.lang.String) {"dataToPass":[{\"address\":\"Himayath Nagar\",\"email\":\"abijeet.p@osmosys.asia\",\"name\":\"Abijeet Patro\",\"server_id\":\"\",\"status\":\"\"},{\"address\":\"himayath naga\",\"email\":\"saravana.e@osmosys.asia\",\"name\":\"Saravana\",\"server_id\":\"\",\"status\":\"\"},{\"address\":\"hellpo world\",\"email\":\"asshole@gmail.com\",\"name\":\"Syai\",\"server_id\":\"\",\"status\":\"\"}]}

しかし、Web サーバーがエラーをスローするため、それは機能していないようです。

{"Message":"Invalid object passed in, member name expected. (16): {\"dataToPass\":[{\\\"address\\\":\\\"Himayath Nagar\\\",\\\"email\\\":\\\"abijeet.p@osmosys.asia\\\",\\\"name\\\":\\\"Abijeet Patro\\\",\\\"server_id\\\":\\\"\\\",\\\"status\\\":\\\"\\\"},{\\\"address\\\":\\\"himayath naga\\\",\\\"email\\\":\\\"saravana.e@osmosys.asia\\\",\\\"name\\\":\\\"Saravana\\\",\\\"server_id\\\":\\\"\\\",\\\"status\\\":\\\"\\\"},{\\\"address\\\":\\\"hellpo world\\\",\\\"email\\\":\\\"asshole@gmail.com\\\",\\\"name\\\":\\\"Syai\\\",\\\"server_id\\\":\\\"\\\",\\\"status\\\":\\\"\\\"}]}","StackTrace":"   at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary(Int32 depth)\r\n   at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)\r\n   at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeList(Int32 depth)\r\n   at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)\r\n   at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary(Int32 depth)\r\n   at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)\r\n   at System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)\r\n   at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)\r\n   at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize[T](String input)\r\n   at System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext context, JavaScriptSerializer serializer)\r\n   at System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData methodData, HttpContext context)\r\n   at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.ArgumentException"}

では、ユーザー定義オブジェクトの配列を Java から ASP.NET Web サービスに渡すにはどうすればよいでしょうか。または、asp.net Web サーバーの GSON 文字列を List オブジェクトに変換する方法はありますか?

JSON.NET を使用して文字列をリストに逆シリアル化できますか?

4

1 に答える 1

1

このリンクには、うまくいった答えがあります。サーバー側でデータを文字列として取得し、それを処理できる配列に変換しています。

サンプル JSON:

string json = "[{Name:'John Simith',Age:35},{Name:'Pablo Perez',Age:34}]"; 

クラス:

public class Person
{
 public int Age {get;set;}
 public string Name {get;set;}
}

逆シリアル化

JavaScriptSerializer js = new JavaScriptSerializer();
Person [] persons =  js.Deserialize<Person[]>(json);

Web サーバーのコードに常にアクセスできるとは限らないため、これが最善の答えではない可能性があります。もうしばらくこのまま放置します。

于 2013-06-05T10:10:07.210 に答える