领域JSON解析问题列表/数组

时间:2016-06-29 09:10:36

标签: c# xamarin realm

我遇到了Realm的问题,并且无法在SomeObject:RealmObject的对象方案中使用基本列表。我正在将Web中的JSON对象直接解析为我的Realm对象。它不像数组部分那样映射,在这个json数据中特别是“entryCharts”数据。这是来自网络的JSON。看一下entryCharts数组。

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

这是我的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; }
}

根据你应该如何将基本类型的数组(如字符串作为嵌套对象)这看起来它应该对我起作用但它没有正确解析。我唯一的猜测是,因为RealmList没有setter,所以它无法在JSON解析器中创建RealmList对象的实例。

1 个答案:

答案 0 :(得分:2)

问题是需要使用Realm.CreateObject<T>()方法创建Realm对象才能使列表关系起作用(参见https://github.com/realm/realm-dotnet/issues/514)。

幸运的是,Newtonsoft.Json能够使用JSON中的值填充已存在的对象。这样,您就可以使用Report创建CreateObject个对象,并将它们传递给JSON序列化程序。 Newtonsoft.Json可以反序列化为一个中间类型(Newtonsoft.Json.Linq.JToken类),可以对其进行操作并进一步反序列化为具体类型。

您可以将您获得的JSON有效负载反序列化为JArray,并为其中的每个元素创建一个Report对象并填充它:

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