c# - JSON.net 反序列化对象嵌套数据
问题描述
我正在使用 SwiftType Elastic Search + C# 并遇到反序列化响应的问题,因为 SwiftType 将所有字段作为具有raw
属性的对象返回(https://swiftype.com/documentation/app-search/api /搜索)例如:
{
"meta": {
"warnings": [],
"page": {
"current": 1,
"total_pages": 1,
"total_results": 2,
"size": 10
},
"request_id": "6887a53f701a59574a0f3a7012e01aa8"
},
"results": [
{
"phone": {
"raw": 3148304280.0
},
"accounts_balance_ach": {
"raw": 27068128.71
},
"accounts_balance_pending": {
"raw": "46809195.64"
},
"email": {
"raw": "Brisa34@hotmail.com"
},
"accounts_count": {
"raw": 6.0
},
"id": {
"raw": "c98808a2-d7d6-4444-834d-2fe4f6858f6b"
},
"display_name": {
"raw": "The Johnstons"
},
"type": {
"raw": "Couple"
},
"advisor_email": {
"raw": "Cornelius_Schiller14@hotmail.com"
},
"created_at": {
"raw": "2018-10-02T10:42:07+00:00"
},
"source": {
"raw": "event"
},
"accounts_balance": {
"raw": 43629003.47
},
"accounts_donations": {
"raw": 38012278.75
},
"advisor_name": {
"raw": "Cloyd Jakubowski"
},
"_meta": {
"score": 0.42934617
}
},
{
"phone": {
"raw": 2272918612.0
},
"accounts_balance_ach": {
"raw": 35721452.35
},
"accounts_balance_pending": {
"raw": "35117465.2"
},
"email": {
"raw": "Ruby87@yahoo.com"
},
"accounts_count": {
"raw": 1.0
},
"id": {
"raw": "687af11f-0f73-4112-879c-1108303cb07a"
},
"display_name": {
"raw": "Kennith Johnston"
},
"type": {
"raw": "Individual"
},
"advisor_email": {
"raw": "Evangeline_Wisoky92@hotmail.com"
},
"created_at": {
"raw": "2018-10-02T16:16:02+00:00"
},
"source": {
"raw": "website"
},
"accounts_balance": {
"raw": 23063874.19
},
"accounts_donations": {
"raw": 33025175.79
},
"advisor_name": {
"raw": "Ernie Mertz"
},
"_meta": {
"score": 0.39096162
}
}
]
}
我需要将每个键映射到它的值,例如 results[0].email = "Brisa34@hotmail.com";
我看到了使用自定义转换器的有前途的选择,但我想确保在采用详细方法之前没有更动态的方法来执行此操作。
解决方案
我建议使用可以在属性中指定路径来将我的JsonPathConverter
类中的属性映射到我的 JSON 中的子属性中找到的类吗?. 这将允许您声明一个强类型Result
类,然后轻松地将每个属性映射到raw
JSON 中相应子值的值,而无需声明大量笨拙的单属性类。
如下所示声明您的模型。请注意,Result
该类需要一个[JsonConverter]
属性来将其绑定到JsonPathConverter
(否则属性路径将不起作用,您将在属性中获得默认值)。
public class RootObject
{
public List<Result> results { get; set; }
}
[JsonConverter(typeof(JsonPathConverter))]
public class Result
{
[JsonProperty("phone.raw")]
public string Phone { get; set; }
[JsonProperty("accounts_balance_ach.raw")]
public decimal AccountsBalanceAch { get; set; }
[JsonProperty("accounts_balance_pending.raw")]
public decimal AccountsBalancePending { get; set; }
[JsonProperty("email.raw")]
public string Email { get; set; }
[JsonProperty("accounts_count.raw")]
public decimal AccountsCount { get; set; }
[JsonProperty("id.raw")]
public string Id { get; set; }
[JsonProperty("display_name.raw")]
public string DisplayName { get; set; }
[JsonProperty("type.raw")]
public string Type { get; set; }
[JsonProperty("advisor_email.raw")]
public string AdvisorEmail { get; set; }
[JsonProperty("created_at.raw")]
public string CreatedAt { get; set; }
[JsonProperty("source.raw")]
public string Source { get; set; }
[JsonProperty("accounts_balance.raw")]
public decimal AccountsBalance { get; set; }
[JsonProperty("accounts_donations.raw")]
public decimal AccountsDonations { get; set; }
[JsonProperty("advisor_name.raw")]
public string AdvisorName { get; set; }
[JsonProperty("_meta.score")]
public decimal MetaScore { get; set; }
}
然后你可以像往常一样反序列化:
var root = JsonConvert.DeserializeObject<RootObject>(json);
这是一个工作演示:https ://dotnetfiddle.net/wYxwIF
推荐阅读
- docker - 在 docker 容器中以 root 身份被拒绝权限
- javascript - Discord bot,如何获得所有连接的“公会/服务器”
- php - 重启PHP-FPM时出现403错误如何解决?
- javascript - 对循环感到困惑 - 欢迎任何帮助
- html - 反应 + CSS 网格 + MongoDB?
- php - Codeigniter 查询不返回我选择的行
- visual-studio-code - 在 VSCode 中切换工作区,无需每次都重新加载
- c++ - 迭代期间添加到 std::unordered_set(或 unordered_map)中的元素是否会在迭代期间被访问?
- javascript - element.count & element.value 在数组中是什么意思?
- java - 引起:java.lang.IllegalArgumentException:无法解析占位符