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...
}
私はそれを考え出した。 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
のリストも同様に作成され、単一のオブジェクトの代わりに人物の配列の使用を受け入れます。これが誰かの役に立つことを願っています。
逆シリアル化しようとしている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);
}
}
}
または、もっと簡単に、$。ajax(...)を使用している場合
data:"{\"key\":"+JSON.stringify(json_array)+"}",
コードの反対側で、関数にパラメーター「オブジェクトキー」を使用させる
[WebMethod]
public static return_type myfunction(object key){...}
サーバ側
[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) + "'}";