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

时间:2015-01-22 11:06:04

标签: c# json serialization json.net

我创建了一个连接到数据库的PHP接口,通过在PHP中编码JSON并使用JSON .NET在C#上解码它。 到目前为止,一切都运行良好。 我有一些我使用的类,我创建它们用于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,即使我自己序列化了对象。

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

我正在尝试解析的类是Recept,我喜欢这样: Recept 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类只包含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;
    }

然后有最后一个名为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;
    }

2 个答案:

答案 0 :(得分:0)

您无需使用这些属性修饰c#类。你发布的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; }
}

答案 1 :(得分:0)

在看到JSON网站的输出后,我已经弄明白了。 我的Benodigdheden阵列被命名为Benodigdheden,而阵列中有Benodigdheid类型的物品。 在将数组重命名为benodigdheid和JSON之后,它仍然有效! 谢谢Felipe Oriani