1. ホーム
  2. c#

[解決済み] JsonConvert.DeserializeObject を使用して、Json を C# POCO クラスにデシリアライズする。

2022-03-06 07:40:24

質問

以下は、私の簡単な User POCOクラスです。

/// <summary>
/// The User class represents a Coderwall User.
/// </summary>
public class User
{
    /// <summary>
    /// A User's username. eg: "sergiotapia, mrkibbles, matumbo"
    /// </summary>
    public string Username { get; set; }

    /// <summary>
    /// A User's name. eg: "Sergio Tapia, John Cosack, Lucy McMillan"
    /// </summary>
    public string Name { get; set; }

    /// <summary>
    /// A User's location. eh: "Bolivia, USA, France, Italy"
    /// </summary>
    public string Location { get; set; }

    public int Endorsements { get; set; } //Todo.
    public string Team { get; set; } //Todo.

    /// <summary>
    /// A collection of the User's linked accounts.
    /// </summary>
    public List<Account> Accounts { get; set; }

    /// <summary>
    /// A collection of the User's awarded badges.
    /// </summary>
    public List<Badge> Badges { get; set; }

}

そして、私が使っているメソッドは、JSON レスポンスをデシリアライズして User オブジェクト(この実際の JSONの呼び出しはこちら ):

private User LoadUserFromJson(string response)
{
    var outObject = JsonConvert.DeserializeObject<User>(response);
    return outObject;
}

これは例外を発生させます。

現在のJSONオブジェクト(例:{"name":"value"})はデシリアライズできない。 タイプに 'System.Collections.Generic.List`1[CoderwallDotNet.Api.Models.Account]' とする。 この型はデシリアライズのためにJSON配列(例:[1,2,3])を必要とするからです。 を正しく表示します。

このエラーを修正するには、JSON を JSON 配列に変更します。 (例: [1,2,3]) または、デシリアライズされた型が通常の .NET型(例:整数のようなプリミティブ型や、コレクション型ではなく 配列やリストのような型) からデシリアライズすることができ、JSON オブジェクトを作成します。また、JsonObjectAttributeを型に追加することで、強制的に を使用して、JSONオブジェクトからデシリアライズすることができます。パス 'accounts.github', ライン 1, の位置は129です。

このDeserializeObjectメソッドを扱ったことがないので、ここでちょっと行き詰まっています。

POCOクラスのプロパティ名が、JSONレスポンスの名前と同じであることを確認しました。

このPOCOクラスにJSONをデシリアライズするには、何を試せばよいのでしょうか?

どのように解決するのですか?

以下は動作例です。

キーポイントは

  • の宣言 Accounts
  • 使用方法 JsonProperty 属性

.

using (WebClient wc = new WebClient())
{
    var json = wc.DownloadString("http://coderwall.com/mdeiters.json");
    var user = JsonConvert.DeserializeObject<User>(json);
}

-

public class User
{
    /// <summary>
    /// A User's username. eg: "sergiotapia, mrkibbles, matumbo"
    /// </summary>
    [JsonProperty("username")]
    public string Username { get; set; }

    /// <summary>
    /// A User's name. eg: "Sergio Tapia, John Cosack, Lucy McMillan"
    /// </summary>
    [JsonProperty("name")]
    public string Name { get; set; }

    /// <summary>
    /// A User's location. eh: "Bolivia, USA, France, Italy"
    /// </summary>
    [JsonProperty("location")]
    public string Location { get; set; }

    [JsonProperty("endorsements")]
    public int Endorsements { get; set; } //Todo.

    [JsonProperty("team")]
    public string Team { get; set; } //Todo.

    /// <summary>
    /// A collection of the User's linked accounts.
    /// </summary>
    [JsonProperty("accounts")]
    public Account Accounts { get; set; }

    /// <summary>
    /// A collection of the User's awarded badges.
    /// </summary>
    [JsonProperty("badges")]
    public List<Badge> Badges { get; set; }
}

public class Account
{
    public string github;
}

public class Badge
{
    [JsonProperty("name")]
    public string Name;
    [JsonProperty("description")]
    public string Description;
    [JsonProperty("created")]
    public string Created;
    [JsonProperty("badge")]
    public string BadgeUrl;
}