0

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

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

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

有 3 个 C# 类QueryParameterCollection即 a KeyedCollection<String, Parameter>)和 a Parameter。所有这些都用DataContract/DataMember属性标记并通过DataContractSerializer没有任何问题进行序列化。

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

有谁知道为什么这些失败,以及我可以做些什么来解决它?

4

1 回答 1

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

于 2013-02-22T09:31:08.133 回答