web-dev-qa-db-ja.com

JSON.netはオブジェクトのネストされたデータをデシリアライズします

私は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]";

カスタムコンバーターの有望なオプション を見ましたが、詳細なアプローチをとる前に、これを行う動的な方法がないことを確認したいと思います。

9
ForrestLyman

にある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

9
Brian Rogers

あなたにとって最も動的な方法は 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オブジェクトになり、そのプロパティにアクセスできます。

2
Barr J

次の 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; }
}
1
Gauravsa