C# JSON .NET 在另一个对象中使用 JsonObjects 反序列化

C# JSON .NET deserialize with JsonObjects in another object

我创建了一个连接到数据库的 PHP 接口,方法是在 PHP 中编码 JSON 并使用 JSON .NET 在 C# 上对其进行解码。 到目前为止一切正常。 我有一些我使用的 classes,我创建它们都是为了与 JSON .NET

一起使用

{
  "ReceptId": "1",
  "Naam": "Rijst met ragout",
  "GramPerPersoon": "280",
  "Type": "Eten",
  "Instructies": [
    "Maak rijst warm",
    "Doe ragout op de rijst"
  ],
  "Benodigdheden": [{
    "Hoeveelheid": "70",
    "Eenheid": "gram",
    "Ingredient": {
      "Ingredient_id": "1",
      "Naam": "Rijst",
      "Beschrijving": "Rijst behoort zoals alle granen tot de grassenfamilie. Rijst is het belangrijkste voedsel voor een groot deel van de wereldbevolking, vooral in de warmere streken.",
      "Energie": "355",
      "Vetten": "0.5",
      "VerzadigdeVetten": "0.2",
      "KoolHydraten": "79",
      "Eiwitten": "7.5"
    }
  }, {
    "Hoeveelheid": "30",
    "Eenheid": "gram",
    "Ingredient": {
      "Ingredient_id": "2",
      "Naam": "Ragout",
      "Beschrijving": "Ragout (Nederlands-Nederlands) of vol-au-vent (Vlaams) is van oorsprong een gerecht dat bestaat uit stukjes gesneden vlees, gevogelte of vis in saus.",
      "Energie": "98",
      "Vetten": "5.5",
      "VerzadigdeVetten": "2.2",
      "KoolHydraten": "3.8",
      "Eiwitten": "8.3"
    }
  }]
}

问题是 Ingredient 对象始终为 NULL,即使我序列化对象本身也是如此。

classes 的构建非常简单,使用 C# 属性来存储变量。 正常的字符串列表以前工作正常,例如 Instructies。

我试图解析的 class 是 Recept,我喜欢这样: 接受接受 = JsonConvert.DeserializeObject(json); JSON 是 JSON 输入,您可以在上面查看。

Recept 包含一些属性,除了 Benodigdheden 之外都可以正常工作。

[JsonProperty]
    public List<Benodigdheid> Benodigdheden
    {
        get;
        private set;
    }

    [JsonProperty]
    public List<string> Instructies
    {
        get;
        private set;
    }

    [JsonProperty]
    public int ReceptId
    {
        get;
        private set;
    }

    [JsonProperty]
    public string Naam
    {
        get;
        private set;
    }

    [JsonProperty]
    public ReceptType Type
    {
        get;
        private set;
    }

    [JsonProperty]
    public int GramPerPersoon
    {
        get;
        private set;
    }

    public Recept(int id, string naam, ReceptType receptType, int gramPP, List<string> instructies, List<Benodigdheid> benodigdheden)
    {
        this.ReceptId = id;
        this.Naam = naam;
        this.Type = receptType;
        this.GramPerPersoon = gramPP;
        this.Instructies = instructies;
        getBenodigdHeden();
    }

Benodigdheid class 仅包含 3 个属性,它们是:

 [JsonProperty]
    public Ingredient Ingredient
    {
        get;
        private set;
    }

    [JsonProperty]
    public int Hoeveelheid
    {
        get;
        private set;
    }

    [JsonProperty]
    public string Eenheid
    {
        get;
        private set;
    }

    public Benodigdheid(Ingredient ingredient, int hoeveelheid, string eenheid)
    {
        this.Ingredient = ingredient;
        this.Hoeveelheid = hoeveelheid;
        this.Eenheid = eenheid;
    }

然后就是最后一个class的Ingredient(英文意思一样)

    [JsonProperty]
    public int Ingredient_id
    {
        get;
        private set;
    }

    [JsonProperty]
    public string Naam
    {
        get;
        private set;
    }

    [JsonProperty]
    public string Beschrijving
    {
        get;
        private set;
    }

    [JsonProperty]
    public float Energie
    {
        get;
        private set;
    }

    [JsonProperty]
    public float Vetten
    {
        get;
        private set;
    }

    [JsonProperty]
    public float VerzadigdeVetten{
        get;
        private set;
    }

    [JsonProperty]
    public float KoolHydraten
    {
        get;
        private set;
    }

    [JsonProperty]
    public float Eiwitten
    {
        get;
        private set;
    }

    public Ingredient(int id, string naam, string beschrijving, float energie, float vetten, float verzadigde_vetten, float koolhydraten, float eiwitten) {
        this.Ingredient_id = id;
        this.Naam = naam;
        this.Beschrijving = beschrijving;
        this.Energie = energie;
        this.Vetten = vetten;
        this.VerzadigdeVetten = verzadigde_vetten;
        this.KoolHydraten = koolhydraten;
        this.Eiwitten = eiwitten;
    }

您不需要用这些属性修饰您的 c# class。从您发布的 json 和 http://json2csharp.com/,我生成了论文 classe,我认为这足以让您反序列化您的 json 数据。

public class Ingredient
{
    public string Ingredient_id { get; set; }
    public string Naam { get; set; }
    public string Beschrijving { get; set; }
    public string Energie { get; set; }
    public string Vetten { get; set; }
    public string VerzadigdeVetten { get; set; }
    public string KoolHydraten { get; set; }
    public string Eiwitten { get; set; }
}

public class Benodigdheden
{
    public string Hoeveelheid { get; set; }
    public string Eenheid { get; set; }
    public Ingredient Ingredient { get; set; }
}

public class RootObject
{
    public string ReceptId { get; set; }
    public string Naam { get; set; }
    public string GramPerPersoon { get; set; }
    public string Type { get; set; }
    public List<string> Instructies { get; set; }
    public List<Benodigdheden> Benodigdheden { get; set; }
}

看到 JSON 网站的输出后,我明白了。 我的 Benodigdheden 阵列被命名为 Benodigdheden,而阵列中有 Benodigdheid 类型的项目。 在将 Array 重命名为 benodigdheid 和 JSON 之后,它成功了! 谢谢 Felipe Oriani