2015-12-12 18 views
7

Ich bin seit einer Weile mit diesem fest und ich kann nicht scheinen, es herauszufinden. Schätze jede Hilfe!ASP.NET WebAPI 2 Nested JSON

Das ist mein Modell: http://www.jsoneditoronline.org/?id=9ee3466c40627f33c284e63544c8b8a7

ich die richtigen C# Objekte wie folgt aufgebaut:

public class Media 
{ 
    public string name { get; set; } 
    public string title { get; set; } 
    public string album { get; set; } 
    public string artist { get; set; } 
    public string length { get; set; } 
    public int bitrate { get; set; } 
    public double size { get; set; } 
    public string start_time { get; set; } 
    public string mimetype { get; set; } 
    public string hash { get; set; } 
} 

public class Playlist 
{ 
    public string name { get; set; } 
    public List<Media> media { get; set; } 
    public List<Graphics> graphics { get; set; } 
    public bool shuffle { get; set; } 
    public int volume { get; set; } 
    public string start_time { get; set; } 
    public string end_time { get; set; } 
} 

public class Day 
{ 
    public string name { get; set; } 
    public List<Playlist> playlists { get; set; } 
} 


public class Schedule 
{ 
    public List<Day> days { get; set; } 
    public string hash { get; set; } 
} 

ich POST brauchen diese ganze JSON-Objekt direkt aus dem MVC-Controller. Bei anderen Gelegenheiten möchte ich PUT den Zeitplan. Wie kann ich das richtig handhaben? Beispiele könnten wirklich helfen.

Danke!

Ich mache bereits das unten für POST:

var schedule = JsonConvert.DeserializeObject<Schedule>(model.ToString()); 

Dies funktioniert wie jedoch zu erwarten, manchmal Media Objekte im Zusammenhang gibt es bereits in der Datenbank und es verursacht einen internen Fehler Server, wenn sie versuchen, die INSERT dasselbe Media Objekt (welches bereits existiert) - Das [Key] für Media ist die hash Eigenschaft.

+2

Soweit ich verstehen kann, hat Ihr tatsächliches Problem nichts mit MVC oder JSON zu tun. Sie benötigen Hilfe, um Fehler bei der Primärschlüsselverletzung zu vermeiden. Ist das korrekt? –

+0

@KosalaW Sort of yeah, das Ändern des Primärschlüssels in eine 'int id' löst dies. Aber das gleiche existierende 'Media'-Objekt in der Datenbank wurde erneut erstellt. Ich will keine Duplikate, wenn ich das Objekt bereits habe ... – user1027620

+2

Bevor Sie 'Media' in Ihre Tabelle einfügen, müssen Sie also prüfen, ob das' Media' bereits in der Tabelle existiert. Wenn dies der Fall ist, aktualisieren Sie es, andernfalls einfügen. –

Antwort

4

Sie müssen Day-Klasse serialisieren.

mit Newtonsoft.json nuget-Paket müssen Sie es als Objekt zu serialisieren. Es wird automatisch komplexe Objekt json

List<Day> days = // list of days result 
var jsonData= JsonConvert.SerializeObject(days); 
return json(jsonData); 

aktualisieren

Wie pro Ihre Update serialize und deserialize Funktionen richtig arbeiten serialisiert. Beim Einfügen von Datensätzen in Media treten Probleme auf. Hash ist nicht eindeutig. und Hash Collision ist möglich. Sie müssen den Hash-Generierungscode verbessern, um Hash als identisch zu verwenden. Nützliche Links zu verstehen Hash

+0

Das übergeordnete Objekt ist vom Typ ' Zeitplan - Bitte überprüfen Sie meine Bearbeitung – user1027620

+0

Bitte überprüfen Sie meine aktualisierte Antwort. Hit als Antwort, wenn Sie es nützlich fanden. –

1

Sie die Erweiterungsmethode verwenden können AddOrUpdate

using System.Data.Entity.Migrations; 

db.Schedule.AddOrUpdate(schedule)