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

您的字符串是一个 C# 字符串,其中包含一个包含 JSON 的 JavaScript 字符串。没有修复您正在发送的内容,以下是您将如何反序列化:

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 方法传入字符串,如果传入的对象映射到对象中的公共字段,则第二个反序列化可能会起作用。

让我们看一个假设 .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 回答