6

カスタムオブジェクトを逆シリアル化できません。

public class UserInfo
{
  public int Id1 { get; set; }
  public string Code { get; set; }
  public int Id2 { get; set; }
  public List<string> Roles { get; set; }
  public string Eg1 { get; set; }
  public DateTime Time{ get; set; }
  public string Eg2 { get; set; }
  public string Version { get; set; }
}

JavaScriptSerializer serializer = new JavaScriptSerializer();

return serializer.Deserialize<UserInfo>(raw);

デシリアライズは例外をスローしています

「タイプ'System.String'のオブジェクトをタイプ'UserInfo'に変換できません」

JSONコンテンツ:

"\"{\\\"Id1\\\":0,\\\"Code\\\":null,\\\"Id2\\\":0,\\\"Roles\\\":null,\\\"Eg1\\\":\\\"Eg2\\\",\\\"Time\\\":\\\"\\\\/Date(-62135596800000)\\\\/\\\",\\\"Version\\\":\\\"1.0.0.0\\\"}\""

注:不明な場合はお知らせください。質問を編集します。

-編集しました。ID2がId2に変更されました。実際のクラスは、変数名の点で異なります。したがって、問題。

4

4 に答える 4

12

文字列は、JSONを含むJavaScript文字列を含むC#文字列です。送信される内容を修正する以外に、デシリアライズする方法は次のとおりです。

var jsonString = serializer.Deserialize<string>(raw);
return serializer.Deserialize<UserInfo>(jsonString);
于 2012-10-09T03:03:39.437 に答える
6

エスケープされた文字列内にオブジェクトがあるため、Javascript文字列をデシリアライザーに渡します。

それをエスケープ解除した後、これはシリアライザーが受け取るものです:

"{\"Id1\":0,\"Code\":null,\"Id2\":0,\"Roles\":null,\"Eg1\":\"Eg2\",\"Time\":\"\\/Date(-62135596800000)\\/\",\"Version\":\"1.0.0.0\"}"

本当に送信したいのは次のとおりです。

{"Id1":0,"Code":null,"Id2":0,"Roles":null,"Eg1":"Eg2","Time":"\/Date(-62135596800000)\/","Version":"1.0.0.0"}"

于 2012-10-09T03:05:22.047 に答える
1

あなたID2はJSONのすべてのキャップであり、Id2クラスにはありません。

編集:

オブジェクトのインスタンスを作成し、それをJSONにシリアル化して、JSONが正しいかどうかを比較して確認してください。その後、その文字列を使用して適切にフォーマットできます。

于 2012-10-09T02:43:12.497 に答える
0

以下のコードは、誰かが立ち上がって実行するのに役立つはずです。

文字列にはデフォルトのコンストラクタがないため、上記のコードではエラーが発生します。文字列がJSON.stringify()クライアントのJavaScriptメソッドから渡された場合、渡されたオブジェクトがオブジェクトのパブリックフィールドにマップされていれば、2番目の逆シリアル化が機能する可能性があります。

.ASHXファイルが次のようなjQuery呼び出しからリクエストを受信すると仮定した簡単な例を見てみましょう。

//Called from with a jQuery ready() in a simple html page

var getNewPerson = function ()
{
var NewPerson       = new Object();
NewPerson.PersonID  = "0";
NewPerson.FirstName = $("#FirstName").val();
NewPerson.LastName  = $("#LastName").val();
NewPerson.Address   = $("#Address").val();
NewPerson.City      = $("#City").val();
NewPerson.State     = $("#State").val();
NewPerson.Zip       = $("#Zip").val();

var arrObj;
var str = "";
var webMethod = "http://someserver.com/admin/DataHandler.ashx";
$.ajax({
cache: false,
url: webMethod,
type: "POST",
dataType: "json",
 /* for hashtable or .net web service -  data: "{\"NewPerson\":" + JSON.stringify(NewPerson) + "}", */
data: JSON.stringify(NewPerson), 
contentType: "application/json; charset=utf-8"
}
)
.done( function(){}... code here ...etc)

//Valid JSON object format: {"PersonID":"1","FirstName":"Rick","LastName":"Wright","Address":"4520 No Such address Ave.","City":"Riverside","State":"CA","Zip":"92503"}

//And here is a sample class on the C# side in the .ashx handler page.
public class NewPerson
    {
        public int PersonID { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Address { get; set; }
        public string City { get; set; }
        public string State { get; set; }
        public string Zip { get; set; }
    } //  EOC Person

//そしてプロセスリクエストで

public void ProcessRequest(HttpContext context)
{
string jsonString = "";
string rawJson = "";
System.Diagnostics.Debugger.Break();

HttpContext.Current.Request.InputStream.Position = 0;
string responseString;
var jsonSerializer = new JavaScriptSerializer();
/*Set the stream position to 0 */
context.Request.InputStream.Position = 0;

using (System.IO.StreamReader inputStream = new StreamReader(context.Request.InputStream))
{
rawJson = inputStream.ReadToEnd();
}
var objNewPerson = jsonSerializer.Deserialize<NewPerson>(rawJson);
if (clientList != null)
{

responseString = objNewPerson.FirstName + " " + objNewPerson.LastName ;
}
else
resp="No Record Found";
} // eof ProcessRequest
于 2013-07-26T23:13:15.443 に答える