JavaScriptSerializer和MVC——与JSON作斗争
本文关键字:斗争 JSON MVC JavaScriptSerializer | 更新日期: 2023-09-27 18:00:27
我一直在试图弄清楚为什么我的一些测试不起作用(TDD),并设法将其追踪到类的序列化,但我不确定为什么它不起作用。有两种风格,一种是简单的版本,另一种是更复杂的版本,稍微复杂一点的版本涉及Parameter.Value.中的值数组
在简单的版本中,我有一个可以使用JavaScriptSerializer
进行序列化的类(我假设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,但在反序列化时,我没有参数,它们似乎只是被遗漏了
有人知道这些失败的原因吗?我能做些什么来修复它吗?
为什么选择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
类使用。