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#类QueryParameterCollection(它是KeyedCollection<String, Parameter>)和Parameter。所有这些都用DataContract/DataMember属性标记,并通过DataContractSerializer串行化,没有任何问题。

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

有人知道这些失败的原因吗?我能做些什么来修复它吗?

JavaScriptSerializer和MVC——与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类使用。