JavaScriptSerializer和MVC - 与JSON斗争

时间:2013-02-22 09:24:36

标签: c# json

我一直在试图找出为什么我的某些测试没有工作(TDD)并设法将其跟踪到类的序列化,但我不确定它为什么不起作用。有两种风格,简单版本和更复杂的版本,稍微复杂一些涉及在Parameter.Value中包含一组值。

简单版本,我有一个可以使用JavaScriptSerializer进行serailzied的类(我假设这是MVC在生成JSON时的工作方式)。它产生的结构如下:

{
   "Name": "TestQuery",
   "QueryId": 1,
   "Parameters": [
   {
        "Name": "MyString",
        "DataType": 0,
        "Value": "A String",
        "IsArray": false
    }],
   "Sql": "SELECT * FROM Queries"
}

有3个C#类QueryParameterCollectionKeyedCollection<String, Parameter>}和Parameter。所有这些都标有DataContract / DataMember属性,并通过DataContractSerializer序列化,没有任何问题。

然而,JavaScriptSerializer将对象正确地序列化为上面的JSON,但是在反序列化时我没有参数,它们似乎只是错过了。

有没有人知道为什么会失败,以及我可以做些什么来修复它?

1 个答案:

答案 0 :(得分:1)

为什么KeyedCollection<String, Parameter>?你有一个数组,而不是字典,所以你的JSON应该匹配以下结构:

public class Query
{
    public int QueryId { get; set; }
    public string Name { get; set; }
    public string Sql { get; set; }
    public Parameter[] Parameters { get; set; }
}

public class Parameter
{
    public string Name { get; set; }
    public int DataType { get; set; }
    public string Value { get; set; }
    public bool IsArray { get; set; }
}

然后你就可以毫无问题地反序列化它了:

var serializer = new JavaScriptSerializer();
var json = @"
{
   ""Name"": ""TestQuery"",
   ""QueryId"": 1,
   ""Parameters"": [
   {
        ""Name"": ""MyString"",
        ""DataType"": 0,
        ""Value"": ""A String"",
        ""IsArray"": false
    }],
   ""Sql"": ""SELECT * FROM Queries""
}";
var query = serializer.Deserialize<Query>(json);

此外,您可以从视图模型中删除[Data*]属性,JavaScriptSerializer类不会使用它们。