首页 > 解决方案 > C# 如何将复杂 JSON 对象的子对象转换为模型

问题描述

我正在从模型转换并将其序列化以发送到 JSON 可编辑的网页。编辑后,我使用 AJAX 将更新后的 JSON 发送到我需要将其转换回原始模型的代码后面。在第一次序列化模型时,它会维护一个 JSON 数组,然后是 JSON 对象。使用 JSON.Stringify 后,JSON Array 变成了 JSON Objects 的 JSON Object。我正在处理多个 JSON 对象,这些对象被显示和编辑以发送到后面的代码。收到的字符串格式为

{"0":

    {"Id":{},
    "ItemNumber":"1",
    "Person":{
        "PersonNumber": "001",
        "Address": {
            "Street": "Test street 123"
            },
        "email": "test@email.com"
        },
    "Contact": {
        "Name" : "Company A"
        },
    "Quantity" : "12"
    },
"1": etc,
}

我想遍历每个充当对象键的数字,但是尝试将其映射到字典或反序列化对象会将数据变成{{ "Id":{}, "ItemNumber" : "1", "Person": {etc }}我想我一直在研究这个问题这么久,解决方案就在前面我的脸,我想太多了,我似乎无法找到正确的方法来以与我试图将其转换为的模型相匹配的形式获取信息。

使用JsonConvert反序列化为 aDictionary<string,Object>让我非常接近,但我仍然遇到了问题

{
    {
    "Id":{},
    "ItemNumber":"1", 
    etc
    }
}

对于单个对象。如果我可以剥离每个对象的外层括号,我相信这将是正确的格式,但我不知道该怎么做。我觉得我这样做是错误的,也许有一种更简单的方法可以用 for 循环索引 Json 对象。是否有属于JsonConvert/的方法JObject可以帮助或使这种转换更清洁,也许来自JToken

这是来自 Code Behind 的一些代码。

[WebMethod]
public static string UpdateItems(string json) //json = {"0":{"Id": etc}}
{
    var result = JsonConvert.DeserializeObject<Dictionary<string, object>>(json); // returns key "0", value { { Format my desired model is in } }
// My goal is to convert it back to the original object like
// JsonConvert.DeserializeObject<Dictionary<string, OriginalModel>> rather than creating a new class
}

标签: javascriptc#jsonajax

解决方案


您可以使用此站点或 Visual Studio从您的 json 生成类:

public class Id
{
}

public class Address
{
    public string Street { get; set; }
}

public class Person
{
    public string PersonNumber { get; set; }
    public Address Address { get; set; }
    public string email { get; set; }
}

public class Contact
{
    public string Name { get; set; }
}

public class NestedObject
{
    public Id Id { get; set; }
    public string ItemNumber { get; set; }
    public Person Person { get; set; }
    public Contact Contact { get; set; }
    public string Quantity { get; set; }
}

现在您可以反序列化您的输入:

var input = "{\"0\":      {\"Id\":{},     \"ItemNumber\":\"1\",     \"Person\":{         \"PersonNumber\": \"001\",         \"Address\": {             \"Street\": \"Test street 123\"             },         \"email\": \"test@email.com\"         },     \"Contact\": {         \"Name\" : \"Company A\"         },     \"Quantity\" : \"12\"     },  }";
var result = JsonConvert.DeserializeObject<Dictionary<string, NestedObject>>(input);

推荐阅读