简体   繁体   English

如何使用C#将使用Newtonsoft.Json库的字符串反序列化为自定义对象

[英]How to Deserialize string using Newtonsoft.Json library into custom object using C#

I have a .NET 3.5 project. 我有一个.NET 3.5项目。 In ajax call I create json object like this: 在ajax调用中,我创建像这样的json对象:

var jsonAOData = JSON.stringify(aoData);
...
data: "{jsonAOData : '" + jsonAOData + "'}"
...

then I pass it to a code behind WebMethod 然后将其传递给WebMethod后面的代码

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public static string jQueryDataTable(string jsonAOData)
{
// Deserialize json into object
var customObj = JsonConvert.DeserializeObject<List<NameValue>>(jsonAOData);

I need to deserialize the object into a CustomParams object. 我需要将该对象反序列化为CustomParams对象。

Here my object: 这是我的对象:

[Serializable]
public class NameValue
{
    public string Name { get; set; }
    public string Value { get; set; }
}

[Serializable]
public class CustomParams
{
    public string sEcho { get; set; }
    public string iColumns { get; set; }
    public string sColumns { get; set; }
    public string iDisplayStart { get; set; }
    public string iDisplayLength { get; set; }
    public string mDataProp_0 { get; set; }
    public string sSearch_0 { get; set; }
    public string bRegex_0 { get; set; }
    public string MyProperty { get; set; }
    public string bSearchable_0 { get; set; }
    public string bSortable_0 { get; set; }
    public string mDataProp_1 { get; set; }
    public string sSearch_1 { get; set; }
    public string bRegex_1 { get; set; }
    public string bSearchable_1 { get; set; }
    public string bSortable_1 { get; set; }
    public string mDataProp_2 { get; set; }
    public string sSearch_2 { get; set; }
    public string bRegex_2 { get; set; }
    public string bSearchable_2 { get; set; }
    public string bSortable_2 { get; set; }
    public string mDataProp_3 { get; set; }
    public string sSearch_3 { get; set; }
    public string bRegex_3 { get; set; }
    public string bSearchable_3 { get; set; }
    public string bSortable_3 { get; set; }
    public string mDataProp_4 { get; set; }
    public string sSearch_4 { get; set; }
    public string bRegex_4 { get; set; }
    public string bSearchable_4 { get; set; }
    public string bSortable_4 { get; set; }
    public string mDataProp_5 { get; set; }
    public string sSearch_5 { get; set; }
    public string bRegex_5 { get; set; }
    public string bSearchable_5 { get; set; }
    public string bSortable_5 { get; set; }
    public string mDataProp_6 { get; set; }
    public string sSearch_6 { get; set; }
    public string bRegex_6 { get; set; }
    public string bSearchable_6 { get; set; }
    public string bSortable_6 { get; set; }
    public string mDataProp_7 { get; set; }
    public string sSearch_7 { get; set; }
    public string bRegex_7 { get; set; }
    public string bSearchable_7 { get; set; }
    public string bSortable_7 { get; set; }
    public string sSearch { get; set; }
    public string bRegex { get; set; }
    public string iSortCol_0 { get; set; }
    public string sSortDir_0 { get; set; }
    public string iSortingCols { get; set; }

}

I would gladly provide more information if needed. 如果需要,我很乐意提供更多信息。 Thanks. 谢谢。

Update: 更新:

I have customObj with all the Names, Values Screen is attached: 我有附带所有名称,值屏幕的customObj:

在此处输入图片说明

I need to still transfer all that data into CustomParams. 我仍然需要将所有数据传输到CustomParams中。

This is a data from debugger code behind for jsonAOData (just a string) that is passed into 这是来自jsonAOData(只是一个字符串)的调试器代码后面的数据,该数据被传递到

string jsonAOData

Here a data: 这里有个数据:

[{\"name\":\"sEcho\",\"value\":1},{\"name\":\"iColumns\",\"value\":8},{\"name\":\"sColumns\",\"value\":\",,,,,,,\"},{\"name\":\"iDisplayStart\",\"value\":0},{\"name\":\"iDisplayLength\",\"value\":10},{\"name\":\"mDataProp_0\",\"value\":0},{\"name\":\"sSearch_0\",\"value\":\"\"},{\"name\":\"bRegex_0\",\"value\":false},{\"name\":\"bSearchable_0\",\"value\":true},{\"name\":\"bSortable_0\",\"value\":true},{\"name\":\"mDataProp_1\",\"value\":1},{\"name\":\"sSearch_1\",\"value\":\"\"},{\"name\":\"bRegex_1\",\"value\":false},{\"name\":\"bSearchable_1\",\"value\":true},{\"name\":\"bSortable_1\",\"value\":true},{\"name\":\"mDataProp_2\",\"value\":2},{\"name\":\"sSearch_2\",\"value\":\"\"},{\"name\":\"bRegex_2\",\"value\":false},{\"name\":\"bSearchable_2\",\"value\":true},{\"name\":\"bSortable_2\",\"value\":true},{\"name\":\"mDataProp_3\",\"value\":3},{\"name\":\"sSearch_3\",\"value\":\"\"},{\"name\":\"bRegex_3\",\"value\":false},{\"name\":\"bSearchable_3\",\"value\":true},{\"name\":\"bSortable_3\",\"value\":true},{\"name\":\"mDataProp_4\",\"value\":4},{\"name\":\"sSearch_4\",\"value\":\"\"},{\"name\":\"bRegex_4\",\"value\":false},{\"name\":\"bSearchable_4\",\"value\":true},{\"name\":\"bSortable_4\",\"value\":true},{\"name\":\"mDataProp_5\",\"value\":5},{\"name\":\"sSearch_5\",\"value\":\"\"},{\"name\":\"bRegex_5\",\"value\":false},{\"name\":\"bSearchable_5\",\"value\":true},{\"name\":\"bSortable_5\",\"value\":true},{\"name\":\"mDataProp_6\",\"value\":6},{\"name\":\"sSearch_6\",\"value\":\"\"},{\"name\":\"bRegex_6\",\"value\":false},{\"name\":\"bSearchable_6\",\"value\":true},{\"name\":\"bSortable_6\",\"value\":true},{\"name\":\"mDataProp_7\",\"value\":7},{\"name\":\"sSearch_7\",\"value\":\"\"},{\"name\":\"bRegex_7\",\"value\":false},{\"name\":\"bSearchable_7\",\"value\":true},{\"name\":\"bSortable_7\",\"value\":true},{\"name\":\"sSearch\",\"value\":\"\"},{\"name\":\"bRegex\",\"value\":false},{\"name\":\"iSortCol_0\",\"value\":0},{\"name\":\"sSortDir_0\",\"value\":\"asc\"},{\"name\":\"iSortingCols\",\"value\":1}]"

My final code looks like this: 我的最终代码如下:

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public static string jQueryDataTable(string jsonAOData)
    {
        // Deserialize json into object             
        List<NameValue> jsonData = JsonConvert.DeserializeObject<List<NameValue>>(jsonAOData);
        CustomParams paramObject = new CustomParams();
        paramObject.sEcho = jsonData.Single(o=> o.Name == "sEcho").Value;
        paramObject.iColumns = jsonData.Single(o=>o.Name == "iColumns").Value;
        // the rest of the parameters

        // ... code ...
    }

Because your JSON is an array, it deserializes to an array/list. 由于您的JSON是数组,因此会反序列化为数组/列表。 You will either need to manually map to your CustomObject class, use reflection, or use something like AutoMapper that automate some of this reflections. 您将需要手动映射到CustomObject类,使用反射或使用诸如AutoMapper之类的方法来自动执行一些反射。 You could implement a custom JSON deserializer, but it will still require you use reflection to assign values to properties. 您可以实现自定义JSON反序列化器,但是仍然需要使用反射将值分配给属性。 This is the simplest way to do it without reflection: 这是无需反思的最简单方法:

var customObj = JsonConvert.DeserializeObject<List<NameValue>>(jsonAOData);

CustomParams paramObject = new CustomParams();
paramObject.sEcho = customObj.Single(o=>o.Name == 'sEcho').Value;
paramObject.iColumns = customObj.Single(o=>o.Name == 'iColumns ').Value;
// etc.

Reformatting the JSON 重新格式化JSON

If you have control over the JSON format, it would be better if you formatted like so as a flat object instead of array: 如果您可以控制JSON格式,则最好将其格式化为平面对象而不是数组:

{ "sEcho":"1","iColumns":8, "sColumns":5, ... }

and then this can be Deserialized directly to a CustomParams object: 然后可以将其直接反序列化为CustomParams对象:

CustomParams paramObject= JsonConvert.DeserializeObject<CustomParams>(jsonAOData);

You could convert the original JSON array on the fly into a flat object from javascript before submitting it by looping through every item in the array to populate a new flat object: 您可以通过循环遍历数组中的每个项目以填充一个新的扁平对象,然后在提交之前将运行中的原始JSON数组立即从javascript转换为扁平对象:

flatObject[arrayItem.name] = arrayItem.value;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM