2016-06-29 23 views
0

Ich renne zu einem Problem mit Realm und die Unfähigkeit, grundlegende Listen in einem Objektschema für SomeObject: RealmObject zu verwenden. Ich analysiere JSON-Objekte aus dem Internet direkt in meinen Realm-Objekten. Es ist nicht Mapping für die Array-Teile, in diesem JSON-Daten insbesondere die "EntryCharts" -Daten. Hier ist der JSON aus dem Internet. Sehen Sie sich das Array entryCharts an.Realm JSON Parsing Problem Liste/Array

{ 
    "id": 20, 
    "tradeType": "Buy", 
    "title": "Enter: at market (1,144p)", 
    "keyPoints": "<ul><li><strong>Enter:</strong> at market (1,144p)</li><li><strong>Stop:</strong> 1107p</li></ul>", 
    "productId": 2, 
    "showAsFeatured": false, 
    "entrySummary": "<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Semper in malesuada id, varius sit amet lectus.&nbsp;</p>\n", 
    "entryCharts": [ 
     { 
     "data": "https://www.somesite.co.uk/somepic.png" 
     } 
    ], 
    "entryDate": "2016-06-22T11:32:53.22", 
    "exitSummary": "", 
    "takeProfitsDate": null, 
    "stopHitDate": null, 
    "createDateUtc": "2016-06-22T11:34:30.04", 
    "status": "Live" 
    }, 

Hier ist meine RealmObject

public class Report : RealmObject 
{ 
    [ObjectId] 
    public int Id { get; set; } 
    public string TradeType { get; set; } 
    public string Title { get; set; } 
    public string KeyPoints { get; set; } 
    public int ProductId { get; set; } 
    public bool ShowAsFeatured { get; set; } 
    public string EntrySummary { get; set; } 
    public RealmList<EntryChart> EntryCharts { get; } 
    public string EntryDate { get; set; } 
    public string ExitSummary { get; set; } 
    public string TakeProfitsDate { get; set; } 
    public string StopHitDate { get; set; } 
    public string CreateDateUtc { get; set; } 
    public string Status { get; set; } 
    public Product Product { get; set; } 

} 

public class EntryChart : RealmObject 
{ 
    public string data { get; set; } 
} 

Basierend auf, wie Sie Ihre vermeintlichen Arrays von Grundtypen wie String als verschachtelte Objekte machen das sieht aus wie es mir arbeiten sollte, aber es ist nicht richtig Parsen. Meine einzige Vermutung ist, dass, weil RealmList keinen Setter hat, keine Instanz des RealmList-Objekts innerhalb des JSON-Parsers erstellt werden kann.

Antwort

0

Das Problem besteht darin, dass Realm-Objekte mit der Realm.CreateObject<T>()-Methode erstellt werden müssen, damit die Listenbeziehungen funktionieren (siehe https://github.com/realm/realm-dotnet/issues/514).

Glücklicherweise hat Newtonsoft.Json die Fähigkeit, ein bereits vorhandenes Objekt mit Werten aus JSON zu füllen. Auf diese Weise können Sie Ihre Report Objekte mit CreateObject erstellen und an den JSON-Serializer übergeben. Newtonsoft.Json kann zu einem Zwischentyp deserialisieren (die Newtonsoft.Json.Linq.JToken-Familie von Klassen), der manipuliert und weiter zu einem konkreten Typ deserialisiert werden kann.

Sie können die JSON Nutzlast Sie in ein JArray bekommen deserialisieren und für jedes Element in dem erstellen Report Objekt und füllen es:

var serializer = JsonSerializer.CreateDefault(); 
var jsonArray = JArray.Parse(jsonString); 
var reports = new List<Report>(); 
realm.Write(() => 
{ 
    foreach (var jsonValue in jsonArray) 
    { 
     var report = realm.CreateObject<Report>(); 
     serializer.Populate(new JTokenReader(jsonValue), report); 
     reports.Add(report); 
    } 
}); 
+0

ausgezeichnet, es kam nie zu mir es in dieser Reihenfolge zu tun. Erstellen Sie das Objekt und analysieren Sie es dann in das Objekt. Vielen Dank. –

+0

@MarkSilver drücken Sie das Häkchen neben der Antwort, wenn Ihr Problem gelöst ist –

+0

@TimCastelijns Ich bin mir dessen bewusst, danke Tim Ich habe den Code noch nicht getestet, also werde ich einmal festgestellt, dass es gelöst ist. –