我遇到了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. </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对象的实例。
答案 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);
}
});