gpt4 book ai didi

c# - 动态地将 JSON 反序列化为 C# 对象

转载 作者:太空宇宙 更新时间:2023-11-03 19:39:04 25 4
gpt4 key购买 nike

我正在从网络服务获取 JSON 数据。它为我提供了包含不同问题和答案的FORM DATA每个答案都是不同的 c# 对象。我正在尝试找到将答案映射到正确的 c# 对象的最佳方法。

例如,如果问题 ID 是“37”,则它是一个地址对象。

我有如下格式的 JSON 字符串

"answers": {
"37": {
"name": "yourAddress37",
"order": "6",
"sublabels": "{\"cc_firstName\":\"First Name\",\"cc_lastName\":\"Last Name\",\"cc_number\":\"Credit Card Number\",\"cc_ccv\":\"Security Code\",\"cc_exp_month\":\"Expiration Month\",\"cc_exp_year\":\"Expiration Year\",\"addr_line1\":\"Street Address\",\"addr_line2\":\"Street Address Line 2\",\"city\":\"City\",\"state\":\"State \\/ Province\",\"postal\":\"Postal \\/ Zip Code\",\"country\":\"Country\"}",
"text": "Your Home Address:",
"type": "control_address",
"answer": {
"addr_line1": "148 east 38st ",
"addr_line2": "",
"city": "Brooklyn ",
"state": "Ny",
"postal": "11203",
"country": ""
},
"prettyFormat": "Street Address: 148 east 38st <br>City: Brooklyn <br>State / Province: Ny<br>Postal / Zip Code: 11203<br>"
},
"38": {
"name": "emergencyContact",
"order": "9",
"sublabels": "{\"prefix\":\"Prefix\",\"first\":\"First Name\",\"middle\":\"Middle Name\",\"last\":\"Last Name\",\"suffix\":\"Suffix\"}",
"text": "Emergency Contact Name:",
"type": "control_fullname",
"answer": {
"first": "Pauline ",
"last": "Sandy "
},
"prettyFormat": "Pauline Sandy "
}
}

它映射到以下 c# 属性

public Dictionary<int, answer> answers{ get; set; }

然后我有一个通用的 Answer 类

public class answer
{
public string name { get; set; }
public dynamic answer { get; set; }
}

如果您查看来自 json 的 ANSWER 数据,那么您会发现每个问题的答案都不同。例如,一个答案是 ADDRESS OBJECT,另一个答案是 FIRST & LAST NAME 对象。

我的问题是,如何自动将 json 反序列化为正确的对象/属性?我可以创建不同的 POCO 对象,例如地址和 ProfileName,但我如何将它们自动映射到正确的对象/属性。

编辑:

遍历所有答案

        foreach (var a in item.answers)
{
// pass the ANSWER OBJECT (dynamic data type) to function
createNewApplication(System.Convert.ToInt16(a.Key), a.Value.answer,ref app);

}


private void createNewApplication(int key, dynamic value,ref HcsApplicant app)
{

if (key == 4) // data is plain string
app.yourPhone = value;
if (key == 8)
app.yourEmail = value;
if (key==37) // data is a object
app.address = value.ToObject<address>();


}

这个方法可以吗?有什么更清洁的方法吗?

最佳答案

我个人不喜欢所有涉及自定义解析和直接查看问题的选项。

您可以通过 JToken 使用部分反序列化类。

只需声明您的 answers字典本身:

public Dictionary<int, JToken> Answers{ get; set; }

然后只要你需要地址页,你就可以简单地做 Answers[37].ToObject<Address>() .如何调用此方法取决于您的其余代码,但您可以将其嵌入到属性中、大开关中、多个方法中,每个类一个。我喜欢的一种选择是使用静态 From每个可反序列化类中的方法:

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

// all the othe properties
// ....

public static Address From(Dictionary<int, JToken> answers)
{
return answers?.TryGetValue(37, out var address) ?? false
? address?.ToObject<Address>()
: null;
}
}

// so you can just write:
var address = Address.From(answers);

作为旁注,请记住 Json.Net 的默认反序列化设置不区分大小写,因此您可以反序列化 name属性从 JSON 到更惯用的 Name POCO 上的属性(property)。

关于c# - 动态地将 JSON 反序列化为 C# 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56763348/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com