私は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": "[email protected]"
},
"accounts_count": {
"raw": 6.0
},
"id": {
"raw": "c98808a2-d7d6-4444-834d-2fe4f6858f6b"
},
"display_name": {
"raw": "The Johnstons"
},
"type": {
"raw": "Couple"
},
"advisor_email": {
"raw": "[email protected]"
},
"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": "[email protected]"
},
"accounts_count": {
"raw": 1.0
},
"id": {
"raw": "687af11f-0f73-4112-879c-1108303cb07a"
},
"display_name": {
"raw": "Kennith Johnston"
},
"type": {
"raw": "Individual"
},
"advisor_email": {
"raw": "[email protected]"
},
"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 = "[email protected]";
カスタムコンバーターの有望なオプション を見ましたが、詳細なアプローチをとる前に、これを行う動的な方法がないことを確認したいと思います。
にあるJsonPathConverter
クラスを使用して、クラスのプロパティをJSONの子プロパティにマップできますか? 。これにより、厳密に型指定されたResult
クラスを宣言し、それぞれのプロパティをJSONのそれぞれのraw
子値の値に簡単にマッピングできます。単一プロパティクラス。
以下のようにモデルを宣言します。 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
あなたにとって最も動的な方法は The Newtonsoft JObejct class を使用することです。
これは、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": "[email protected]"
},
"accounts_count": {
"raw": 6.0
},
"id": {
"raw": "c98808a2-d7d6-4444-834d-2fe4f6858f6b"
},
"display_name": {
"raw": "The Johnstons"
},
"type": {
"raw": "Couple"
},
"advisor_email": {
"raw": "[email protected]"
},
"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": "[email protected]"
},
"accounts_count": {
"raw": 1.0
},
"id": {
"raw": "687af11f-0f73-4112-879c-1108303cb07a"
},
"display_name": {
"raw": "Kennith Johnston"
},
"type": {
"raw": "Individual"
},
"advisor_email": {
"raw": "[email protected]"
},
"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);
result
はJSONオブジェクトになり、そのプロパティにアクセスできます。
次の link を使用して、jsonをC#クラスに変換できます。次に、Newtonsoft Jsonを使用して解析できます。
var jsonMessage = "{ \"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\": \"[email protected]\" }, \"accounts_count\": { \"raw\": 6.0 }, \"id\": { \"raw\": \"c98808a2-d7d6-4444-834d-2fe4f6858f6b\" }, \"display_name\": { \"raw\": \"The Johnstons\" }, \"type\": { \"raw\": \"Couple\" }, \"advisor_email\": { \"raw\": \"[email protected]\" }, \"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\": \"[email protected]\" }, \"accounts_count\": { \"raw\": 1.0 }, \"id\": { \"raw\": \"687af11f-0f73-4112-879c-1108303cb07a\" }, \"display_name\": { \"raw\": \"Kennith Johnston\" }, \"type\": { \"raw\": \"Individual\" }, \"advisor_email\": { \"raw\": \"[email protected]\" }, \"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 } } ]}";
var message = JsonConvert.DeserializeObject<RootObject>(jsonMessage);
Console.WriteLine(message.meta.page.current); // prints 1
public class Page
{
public int current { get; set; }
public int total_pages { get; set; }
public int total_results { get; set; }
public int size { get; set; }
}
public class Meta
{
public List<object> warnings { get; set; }
public Page page { get; set; }
public string request_id { get; set; }
}
public class Phone
{
public double raw { get; set; }
}
public class AccountsBalanceAch
{
public double raw { get; set; }
}
public class AccountsBalancePending
{
public string raw { get; set; }
}
public class Email
{
public string raw { get; set; }
}
public class AccountsCount
{
public double raw { get; set; }
}
public class Id
{
public string raw { get; set; }
}
public class DisplayName
{
public string raw { get; set; }
}
public class Type
{
public string raw { get; set; }
}
public class AdvisorEmail
{
public string raw { get; set; }
}
public class CreatedAt
{
public DateTime raw { get; set; }
}
public class Source
{
public string raw { get; set; }
}
public class AccountsBalance
{
public double raw { get; set; }
}
public class AccountsDonations
{
public double raw { get; set; }
}
public class AdvisorName
{
public string raw { get; set; }
}
public class Meta2
{
public double score { get; set; }
}
public class Result
{
public Phone phone { get; set; }
public AccountsBalanceAch accounts_balance_ach { get; set; }
public AccountsBalancePending accounts_balance_pending { get; set; }
public Email email { get; set; }
public AccountsCount accounts_count { get; set; }
public Id id { get; set; }
public DisplayName display_name { get; set; }
public Type type { get; set; }
public AdvisorEmail advisor_email { get; set; }
public CreatedAt created_at { get; set; }
public Source source { get; set; }
public AccountsBalance accounts_balance { get; set; }
public AccountsDonations accounts_donations { get; set; }
public AdvisorName advisor_name { get; set; }
public Meta2 _meta { get; set; }
}
public class RootObject
{
public Meta meta { get; set; }
public List<Result> results { get; set; }
}