【问题标题】:Realm JSON parsing issue list/array领域 JSON 解析问题列表/数组
【发布时间】:2016-06-29 09:10:35
【问题描述】:

我遇到了 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 没有设置器,它无法在 JSON 解析器中创建 RealmList 对象的实例。

【问题讨论】:

    标签: c# xamarin realm


    【解决方案1】:

    问题是需要使用Realm.CreateObject&lt;T&gt;() 方法创建领域对象才能使列表关系起作用(请参阅https://github.com/realm/realm-dotnet/issues/514)。

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

    您可以反序列化您进入 JArray 的 JSON 有效负载,并为其中的每个元素创建一个 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);
        }
    });
    

    【讨论】:

    • 太棒了,我从来没有想过按这个顺序做。创建对象,然后解析到对象。谢谢。
    • @MarkSilver 如果您的问题得到解决,请点击答案旁边的复选标记
    • @TimCastelijns 我知道了,谢谢 Tim 我还没有测试过代码,所以一旦我确定它已经解决了,我就会去测试。
    猜你喜欢
    • 1970-01-01
    • 2019-04-30
    • 2019-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-20
    • 1970-01-01
    相关资源
    最近更新 更多