C# Json.Net序列化对象丢失其Id值

C# 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

我正在使用Json.Net对对象进行序列化和反序列化

我遇到一个问题,反序列化对象recordPosted的Id为零

而序列化记录将包含一个180的Id

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; }