2015-01-22 2 views
1

Я создал интерфейс PHP, который соединяется с базой данных, кодируя JSON в PHP и расшифровывая его на C# с использованием JSON .NET. Все работает до сих пор. У меня есть несколько классов, которые я использую, которые я все созданные для работы с JSON .NETC# JSON .NET deserialize с JsonObjects в другом объекте

{ 
 
    "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" 
 
    } 
 
    }] 
 
}

Проблема заключается в том, что объект Ингредиент всегда NULL, даже когда я сериализации сам объект.

Классы были построены очень упрощенно, используя свойства C# для хранения переменных. Обычные списки строк отлично зарекомендовали себя, например, инструкции.

Класс, который я пытаюсь проанализировать, это 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 содержит только три свойства, которые являются:

[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; 
    } 

Тогда последний класс с именем Ингредиент (что означает то же самое на английском языке)

[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; 
    } 
+0

Я попытался воспроизвести вашу проблему в Linqpad, импортируя ваш класс Ingredient и делая JsonConvert.DeserializeObject (json); где json - это строка, содержащая только ингредиент из вашего примера json, и все работает нормально, с атрибутами JsonProperty или без них (которые бесполезны). Я думаю, ваша проблема находится в другом месте –

ответ

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; } 
} 
0

После просмотра вывода на веб-сайте JSON я понял это. Мой массив из Benodigdheden был назван Benodigdheden, в то время как в массиве были элементы типа Benodigdheid. После переименования массива в benodigdheid и JSON тоже это сработало! Thanks Felipe Oriani