JavascriptSerializer,Deserializer,无法反序列化我的对象

时间:2012-10-09 02:30:49

标签: c# .net json

我无法反序列化自定义对象。

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);

Deserialize正在抛出异常

“无法将'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 个答案:

答案 0 :(得分:10)

您的字符串是一个C#字符串,其中包含一个包含JSON的JavaScript字符串。如果没有确定你发送的内容,请按照以下方式进行反序列化:

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

答案 1 :(得分:7)

您正在将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"}"

答案 2 :(得分:1)

您的ID2是JSON中的全部大写,Id2不属于您的班级。

编辑:

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

答案 3 :(得分:0)

以下代码可以帮助某人启动并运行。

上面的代码会导致错误,因为string没有默认构造函数。 如果从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