Realm JSON解析问题列表/数组

本文关键字:列表 数组 问题 JSON Realm | 更新日期: 2023-09-27 17:53:09

我遇到了一个问题,Realm和无法在SomeObject: RealmObject的对象方案中使用基本列表。我解析JSON对象从网络直接在我的领域对象。它不像数组部分那样映射,在这个json数据中,特别是"entryCharts"数据。这是来自web的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对象的实例。

Realm JSON解析问题列表/数组

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

幸运的是,Newtonsoft。Json能够用Json中的值填充已经存在的对象。这样,您就可以使用CreateObject创建Report对象,并将它们传递给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);
    }
});