JavaScript序列化器和反序列化器,无法对我的对象进行反序列化。

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。实际类的变量名不同,因此出现了问题。


2
肯定不是所有的JSON都有那么多反斜杠!请确保在帖子中放置实际[JSON]文本,而不是检查器-如果这是一个字符串文字值会怎样..如果这样做,显然会发现文本值是“json垃圾,它是一个字符串而不是JSON对象” - user166390
谢谢...看来我当时像是吃了安眠药一样。当我仔细看它的时候,我发现我序列化了两次!因此无法重新转换。现在它可以工作了。更新了正确的JSON。 - NSN
4个回答

12

你的字符串是一个包含 JSON 的 JavaScript 字符串,它是 C# 字符串的一部分。除了修复您接收到的内容外,这是如何反序列化:

var jsonString = serializer.Deserialize<string>(raw);
return serializer.Deserialize<UserInfo>(jsonString);

谢谢!我一直在寻找一种干净的方法来处理这个问题。我之前从未想过将类型转换为字符串...现在完美解决了。 - Anthony Mason
1
这样做不行。字符串没有无参构造函数。 - Samuel Jenks

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"}

1

你的 JSON 中 ID2 是全大写,而你的类中没有 Id2

编辑:

尝试创建一个对象实例并将其序列化为 JSON,以比较并查看 JSON 是否正确。然后,你可以使用该字符串进行正确的格式化。


0
以下代码应该帮助某人开始运行。
上述代码将在因为字符串没有默认构造函数而导致错误。 如果从JSON.stringify()客户端JavaScript方法传递了一个字符串,则如果传递的对象映射到对象中的公共字段,则第二个Deserialize可能会起作用。
让我们看一个快速示例,假设一个.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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接