C#:如何反序列化 json 字符串以获得与 webmethod 参数相同的结果?

C#: How to deserialize json string to get the same result as webmethod parameter?

现在我有一些数据如下:

{"parameters":{"fields":["a","b","c"]}

我使用 ajax 将请求发送到 .net WebMethod,如下所示:

$.ajax({
    url: 'Query/Query.asmx/test2?nocache=1',
                    dataType: "json",
                    data: JSON.stringify(data),
                    type: 'POST',
                    contentType: "application/json; charset=utf-8",

})

我在query.asmx中使用的WebMethod是:

[WebMethod]
public string test2(Dictionary<string, object> parameters)
{
    return "ok";
}

我们可以看到 parameters["fields"] 的类型是 System.Object[]

但是现在我有一个需求,需要在后台对数据进行压缩和解压,数据变成一个字符串(解压后)。现在我想将它反序列化为与以前完全相同的类型。

解压后数据变成JSON字符串:

"{\"parameters\":{\"fields\":[\"a\",\"b\",\"c\"]}}"

现在想用JavaScriptSerializer反序列化成同类型。但是我能得到的是 parameters["fields"] 类型 System.Collections.ArrayList 而不是我需要的 System.Object[] 类型。

代码如下

public class TestDataObject
{
    public Dictionary<string, object> parameters { get; set; }
}

-

var serializer = new JavaScriptSerializer();
var a = serializer.Deserialize<TestDataObject>(d);

所以问题是:有没有办法让我将它反序列化为完全相同的类型?我无法使用其他库,因为我已经为某些自定义类型实现了一些 javascriptSerializer 转换器。

您可以将字典中的值类型更改为 object[] 而不是 object:

public class TestDataObject
{
    public Dictionary<string, object[]> parameters { get; set; }
}

string json = "{\"parameters\":{\"fields\":[\"a\",\"b\",\"c\"]}}";
var serializer = new JavaScriptSerializer();
var a = serializer.Deserialize<TestDataObject>(json);
a.parameters["fields"].GetType() == typeof(object[]); //equals True

JavascriptSerializer中,有一个方法ConvertToType可以用来将对象转换为class实例。 DeserializeObject()调用后,结果类型正是我想要的。所以,代码可以是:

    var b = serializer.DeserializeObject(d);
    var c = serializer.ConvertToType(b, typeof(TestDataObject));