我正在使用neo4jclient,我的一个数据类具有Collection<string>
属性。
保存时,我收到以下错误:
“无法将属性'SomeArrayPropertyName'设置为空数组,因为,因为那里 没有任何类型的值,也没有预先存在的集合 推断类型,不可能确定要的数组类型 店“。
有没有办法保存空数组而不将其更改为Null?
编辑:
示例:
public class BaseData
{
public Guid Id { get; set; }
...
...
public Collection<string> Subjects { get; set; }
public BaseData()
{
Subjects = new Collection<string>();
}
//This method lets Json.Net know whether to serialize 'Subjects'
public virtual bool ShouldSerializeSubjects()
{
return Subjects != null && Subjects.Any();
}
}
public class ParentData : BaseData
{
}
public class ChildData : ParentData
{
public String Name { get; set; }
public String Description { get; set; }
...
...
}
答案 0 :(得分:3)
Neo4jclient使用Json.net来解析数据类,因此可以向Json.net寻找的Data类中添加一个方法,格式为ShouldSerializePROPERTYNAME
(参见例子如下)。
public class Actor
{
public string Name { get;set;}
public Collection<string> Alternatives { get;set; }
//This method lets Json.Net know whether to serialize 'Alternatives'
public bool ShouldSerializeAlternatives()
{
return Alternatives != null && Alternatives.Any();
}
}
这会将new Actor{Name = "Jeff", Alternatives=new Collection<string>()}
序列化为:{"Name":"Jeff"}
- 完全没有Alternatives
。
显然,这里的缺点是你的类在反序列化时会有一个空集合 - 你可能没问题,或者没有 - 如果没有 - 你可以在构造函数中粘贴一个初始化器:
public Actor() { Alternatives = new Collection<string>(); }
当Json.Net反序列化对象时将调用它。
使用IContractResolver还有另一种方法,但如果您有权访问数据类,则上述方法最简单。
没有办法绕过空集合而不是序列化它,因为neo4j不允许你发送数据。
- 编辑 -
public class BaseData
{
public Guid Id { get; set; }
public Collection<string> Subjects { get; set; }
public bool ShouldSerializeSubjects()
{
return Subjects != null && Subjects.Any();
}
public BaseData()
{
Subjects = new Collection<string>();
}
}
public class ParentData :BaseData {}
public class ChildData : ParentData
{
public string Name { get; set; }
public string Description { get; set; }
}
class Program
{
static void Main()
{
var client = new GraphClient(new Uri("http://localhost.:7474/db/data/"));
client.Connect();
var cd = new ChildData { Name = "c1", Description = "des", Id = Guid.NewGuid() };
var nodeRef = client.Create(cd);
var cdRetrieved = client.Get<ChildData>(nodeRef);
Console.WriteLine("Name: {0}, Description: {1}, Id: {2}, Subjects: {3}", cd.Name, cd.Description, cd.Id, cd.Subjects.Count);
Console.WriteLine("Name: {0}, Description: {1}, Id: {2}, Subjects: {3}", cdRetrieved.Data.Name, cdRetrieved.Data.Description, cdRetrieved.Data.Id, cdRetrieved.Data.Subjects.Count);
var json = JsonConvert.SerializeObject(cd);
Console.WriteLine(json);
}
提供以下输出:
Name: c1, Description: des, Id: ff21b0fe-0a51-4269-a1d4-e148c905a6d7, Subjects: 0
Name: c1, Description: des, Id: ff21b0fe-0a51-4269-a1d4-e148c905a6d7, Subjects: 0
{"Name":"c1","Description":"des","Id":"ff21b0fe-0a51-4269-a1d4-e148c905a6d7"}
最后一行是Json.Net的实际JSON输出,没有'subject'序列化。
答案 1 :(得分:0)
从Neo4j doco粘贴:
只有在某些先决条件下才能存储空数组。由于JSON传输格式不包含数组的类型信息,因此可以从数组中的值推断类型。如果数组为空,则Neo4j服务器无法确定类型。在这些情况下,它将检查是否已为给定属性存储数组,并在存储空数组时使用存储的数组类型。如果尚未存在阵列,则服务器将拒绝该请求。
这意味着在更新Neo4j已知数组类型的现有数组时,提供空数组。新的数组属性不能为空。