JSON.net反序列化对象嵌套数据

For*_*man 8 c# json json.net elasticsearch app-search

我正在使用SwiftType Elastic Search + C#并遇到反序列化响应的问题,原因是SwiftType将所有字段作为具有raw属性的对象返回为对象(https://swiftype.com/documentation/app-search/api / search),例如:

{
  "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
      }
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我需要将每个键映射到其值,例如results [0] .email =“ Brisa34@hotmail.com”;

我看到了自定义转换器的一个有前途的选项,但是我想确保在采用详细方法之前没有更动态的方法来执行此操作。

Bri*_*ers 9

我建议使用可以在属性中指定路径以JsonPathConverter中的属性映射到JSON中的子属性的类吗?。这将允许您声明一个强类型的Result类,然后轻松地将每个属性映射到rawJSON中相应子值的值,而不必声明大量笨拙的单属性类。

如下所示声明您的模型。请注意,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; }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以照常反序列化:

var root = JsonConvert.DeserializeObject<RootObject>(json);
Run Code Online (Sandbox Code Playgroud)

这是一个有效的演示:https : //dotnetfiddle.net/wYxwIF


Bar*_*r J 4

对您来说最动态的方法是使用Newtonsoft JObejct 类

它会将您的 JSON 字符串解析为 JSON 对象供您使用,这是如果您没有相应的模型并且需要创建动态 JSON 对象的情况。

例如

string json = "{
  "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
      }
    }
  ]
}"

JObject result = JObject.Parse(json);
Run Code Online (Sandbox Code Playgroud)

result现在是一个 JSON 对象,您可以访问它的属性。