C# Json.Net序列化对象丢失其Id值
我正在使用Json.Net对对象进行序列化和反序列化 我遇到一个问题,反序列化对象recordPosted的Id为零 而序列化记录将包含一个180的IdC# Json.Net序列化对象丢失其Id值,c#,json,json.net,C#,Json,Json.net,我正在使用Json.Net对对象进行序列化和反序列化 我遇到一个问题,反序列化对象recordPosted的Id为零 而序列化记录将包含一个180的Id JsonSerializerSettings jsSettings = new JsonSerializerSettings(); jsSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; var recordAsJson = JsonConvert.SerializeO
JsonSerializerSettings jsSettings = new JsonSerializerSettings();
jsSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
var recordAsJson = JsonConvert.SerializeObject(recordToUpdate,
Formatting.None, jsSettings);
//recordAsJson = {"Id":180,....
var recordPosted = JsonConvert.DeserializeObject<record>(recordAsJson);
//recordPosted = Id : 0
您没有显示
记录
,但我敢打赌您有如下内容:
private int id;
public int Id { get { return id; } }
序列化程序在这里无法设置Id
,因此。。。没有。注意:一些序列化程序(XmlSerializer
)也会拒绝对此类数据进行序列化,但JSON序列化程序往往更为宽容,因为只使用序列化将数据从web服务器返回到javascript客户机是很常见的,包括匿名类型(在C#中是不可变的)
您可以尝试设置一个专用的:
private int id;
public int Id { get { return id; } private set { id = value; } }
(或另选)
如果仍然不起作用-可能必须完全公开:
private int id;
public int Id { get { return id; } set { id = value; } }
(或另选)
默认情况下,Json.NET不设置私有属性设置器。要么公开setter,要么在属性上放置[JsonProperty]属性。我们可以看看record.Id
是如何声明的吗。这是一个通过nHibernate保存的对象。@Nicholas当时我不在一百万英里外。。。看起来JSON.Net不喜欢private
。如果nHibernate无法添加公共集
,我建议使用单独的DTO进行序列化。干杯,Marc我将首先研究nHibernate公共/私有集。nHibernate到公共集似乎不可能-我将使用单独的DTO进行序列化,但它似乎有点笨拙…?抱歉Marc,但考虑到James本人的答复,我必须更改我的接受答案。我刚刚遇到这个问题,因为(6.0节)如果私有属性是int
,则不会设置私有属性,但如果它们是string
s,则会设置私有属性。
public int Id { get; private set; }
private int id;
public int Id { get { return id; } set { id = value; } }
public int Id { get; set; }