我一直在试图找出为什么我的某些测试没有工作(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#类Query
,ParameterCollection
(KeyedCollection<String, Parameter>
}和Parameter
。所有这些都标有DataContract
/ DataMember
属性,并通过DataContractSerializer
序列化,没有任何问题。
然而,JavaScriptSerializer
将对象正确地序列化为上面的JSON,但是在反序列化时我没有参数,它们似乎只是错过了。
有没有人知道为什么会失败,以及我可以做些什么来修复它?
答案 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
类不会使用它们。