web-dev-qa-db-ja.com

JSONオブジェクトをList <type>としてデシリアライズするとasmxサービスが機能しない

JSON文字列の逆シリアル化に問題があります。タイプpersonのクラスがあり、タイプint、姓、名のシーケンス番号のパブリックプロパティがあります。これらのオブジェクトの配列をJSON形式で渡し、それらをリストとして逆シリアル化してサーバー上でループできるようにしたいのですが、ASP.NETは、配列として逆シリアル化することがサポートされていないことについて何か言っています。私が作成しているJSONを検証しましたが、それは有効です。 ASP.NETが逆シリアル化する前に必要なJSONについて何か特別なものはありますか?おもしろいのは、list <person>オブジェクトをJSONにシリアル化すると、生成しているJSONとまったく同じように見えることです。何かが欠けている必要があります...明確にするために、ASP.NET Ajaxライブラリを使用して逆シリアル化しています。これは私がウェブサービスから返すものです:

{"メッセージ": "タイプ\ u0027System.Collections.Generic.IDictionary`2 [[System.String、mscorlib、Version = 2.0.0.0、Culture = neutral、PublicKeyToken = b77a5c561934e089]、[System.Object、mscorlib、Version = 2.0 .0.0、Culture = neutral、PublicKeyToken = b77a5c561934e089]]\u0027は、配列の逆シリアル化ではサポートされていません。 "

実際、残念ながらこれはデシリアライズとは関係がないようです。JSONオブジェクトの配列をasmx Webサービスに渡すことができないようです。私は正しいですか?それができない場合、JSONオブジェクトのコレクションをWebサービスに渡して、ASP.NETとC#を使用してサーバー上で処理させることはできますか?

更新:

OK、これが私のコードです。これが人物クラスです:

public class person
{
    public person()
    {
        //
        // TODO: Add constructor logic here
        //
    }

    public int seq
    {
        get;
        set;
     }

    public string firstName
    {
        get;
        set;
     }
     public string lastName
     {
        get;
        set;
     }

}  

そしてここに私のJSON文字列があります:

[{"seq":1,"firstName":"Chris","lastName":"Westbrook"},
{"seq":2,"firstName":"sayyl","lastName":"westbrook"}]  

そしてこれが私が使っているコードです

    [WebMethod]
    public void updatePeople(string json)
    {
        IList<person> people = 
         new JavaScriptSerializer().Deserialize<IList<person>>(json);

        //do stuff...
    }
19
Chris Westbrook

私はそれを考え出した。 ASP.NET Ajaxが必要とするようなオブジェクトでJSONをラップしていませんでした。この質問を今後閲覧する場合、すべてのJSONオブジェクトをWebサービスに送信する前に、メインオブジェクトでラップする必要があります。これを行う最も簡単な方法は、JavaScriptでオブジェクトを作成し、json2.jsなどを使用して文字列化することです。また、asmx Webサービスを使用している場合、オブジェクトを正しくシリアル化するには__type属性が必要です。この例は次のとおりです。

var person=new object;
person.firstName="chris";
person.lastName="Westbrook";
person.seq=-1;
var data=new object;
data.p=person;
JSON.stringify(data);

これにより、人物オブジェクトをラップするpというオブジェクトが作成されます。これは、Webサービスのパラメーターpにリンクできます。タイプpersonのリストも同様に作成され、単一のオブジェクトの代わりに人物の配列の使用を受け入れます。これが誰かの役に立つことを願っています。

26
Chris Westbrook

逆シリアル化しようとしているJSON文字列と Deserialize メソッドの使用方法を示していただけますか?以下は正常に動作します:

using System;
using System.Collections.Generic;
using System.Web.Script.Serialization;

namespace Test
{
    class Program
    {
        class Person 
        {
            public int SequenceNumber { get; set; }
            public string FirstName { get; set; }
            public string LastName { get; set; }
        }

        public static void Main() 
        {
            string json = "[{\"SequenceNumber\":1,\"FirstName\":\"FN1\",\"LastName\":\"LN1\"},{\"SequenceNumber\":2,\"FirstName\":\"FN2\",\"LastName\":\"LN2\"}]";
            IList<Person> persons = new JavaScriptSerializer()
                .Deserialize<IList<Person>>(json);
            Console.WriteLine(persons.Count);
        }
    }
}
25
Darin Dimitrov

または、もっと簡単に、$。ajax(...)を使用している場合

data:"{\"key\":"+JSON.stringify(json_array)+"}",

コードの反対側で、関数にパラメーター「オブジェクトキー」を使用させる

[WebMethod]
public static return_type myfunction(object key){...}
6
Louis

サーバ側

[WebMethod]
public void updatePeople(object json)

クライアント側

var person = "[{"seq":1,"firstName":"Chris","lastName":"Westbrook"}
,{"seq":2,"firstName":"sayyl","lastName":"westbrook"}]";

var str = "{'json':'" + JSON.stringify(person) + "'}";
0
Mario Hernandez