将json动态内容转换为C#对象(或字典)

cwxwcias  于 2023-02-17  发布在  C#
关注(0)|答案(3)|浏览(198)
{
    "results": [
        {
            "content1": {
                "prop1" : "value1",
                "prop2" : "value2"
            },
            "content2": {
                "prop1" : "value1",
                "prop2" : "value2"
            },
            "contentn": {
                "prop1" : "value1",
                "prop2" : "value2"
            }
        }
    ]
}

我在将这个json转换为动态C#对象时遇到了麻烦,这里的情况是'content1'到'content'总是不同的动态内容,我确实需要将它转换为类似字典的东西。这个想法是减少类,因为我需要创建大量的类。
PS:我使用的是第三方API,返回的数据如上所述。
尝试了多种方法来处理此问题。JsonConvert尝试Map到DictionaryListJsonSerializer.Deserialize也是如此

gc0ot86w

gc0ot86w1#

下面的解决方案使用System.Text.Json
创建一个Content类:

public class Content
{
    public string prop1 { get; set; }
    public string prop2 { get; set; }
}

现在你可以反序列化:

var data = "{\r\n    \"results\": [\r\n        {\r\n            \"content1\": {\r\n                \"prop1\" : \"value1\",\r\n                \"prop2\" : \"value2\"\r\n            },\r\n            \"content2\": {\r\n                \"prop1\" : \"value1\",\r\n                \"prop2\" : \"value2\"\r\n            },\r\n            \"contentn\": {\r\n                \"prop1\" : \"value1\",\r\n                \"prop2\" : \"value2\"\r\n            }\r\n        }\r\n    ]\r\n}";

var serData = JsonSerializer.Deserialize<Dictionary<string, List<object>>>(data);
var myResults = serData.First().Value[0].ToString();
if(!string.IsNullOrEmpty(myResults))
{
    var myDynamicObjects = JsonSerializer.Deserialize<Dictionary<string, Content>>(myResults);
}
fnvucqvd

fnvucqvd2#

要将JSON转换为动态C#对象,可以使用Newtonsoft.Json.Linq名称空间中的JObject类,下面是一个示例:

using Newtonsoft.Json.Linq;

// assuming that your JSON is stored in a string variable called json
JObject obj = JObject.Parse(json);
dynamic results = obj["results"][0];

foreach (JProperty prop in results)
{
    string propName = prop.Name;
    dynamic content = prop.Value;

    // access properties of content dynamically
    string prop1Value = content.prop1;
    string prop2Value = content.prop2;

    // do something with the dynamic content
}

在本例中,我们首先使用JObject.Parse将JSON字符串解析为JObject,然后访问results数组和该数组中的第一个对象(假设只有一个),并将该对象存储在dynamic变量中,该变量允许我们动态访问其属性。
接下来,我们使用foreach循环遍历动态对象的所有属性。在循环内部,我们可以使用prop.Name访问属性的名称,使用prop.Value访问属性的值。我们将值存储在另一个名为contentdynamic变量中。
最后,我们可以使用点标记动态访问content对象的属性,就像访问常规C#对象一样,在本例中,我们访问prop1prop2,但是可以用JSON中的实际属性名替换它们。

e3bfsja2

e3bfsja23#

您可以尝试使用ExpandoObject非常强大的那种工作。

static async Task Main(string[] _)
{
    var dynamicReturn = await new HttpClient().GetFromJsonAsync<ExpandoObject>("https://run.mocky.io/v3/dab5a150-40a9-4520-a809-ff5484489fe9");

    foreach (var kvp in dynamicReturn)
    {
        Console.WriteLine(kvp.Key + ": " + kvp.Value);
    }
}

相关问题