使用非法变量字符在C#中反序列化json

我正在编写一个与REST服务交互的.NET库(使用Newtonsoft),我有一个返回json的服务,但json id字段被称为’$ id’。 所以我不能在我的C#数据类中创建相应的$ id属性。 我试着用类似的东西

[JsonObject(MemberSerialization.OptOut)] public class DocData { [JsonProperty("$id")] public string id { get; set; } public string Name { get; set; } } 

但是当Name被分配时,id属性不会。 有谁知道如何将这个json密钥映射到.NET?

谢谢

看起来这是JSON.NET中的一个错误,我认为你应该报告它 。 它在LINQPad中适用于除$id之外的任何属性名称。

 void Main() { var s = JsonConvert.SerializeObject(new DocData{id = "hi", Name = "world"}).Dump(); JsonConvert.DeserializeObject(s).Dump(); } public class DocData { // [JsonProperty("i$d")] // this would work // [JsonProperty("_id")] // as would this // [JsonProperty("$name")] // and even this [JsonProperty("$id")] // but this fails public string id { get; set; } public string Name { get; set; } } 

显然,Json.NET使用$id作为保留字来帮助它处理对象引用。

  var dd = new DocData{id = "hi", Name = "world"}; JsonConvert.SerializeObject(new[]{dd, dd}, new JsonSerializerSettings{PreserveReferencesHandling = PreserveReferencesHandling.Objects}).Dump(); // Output: [{"$id":"1","$id":"hi","Name":"world"},{"$ref":"1"}] 

但是,如果你没有使用引用处理,它似乎应该让你捕获$id属性。

作为一种解决方法,您可以将其解析为JObject,并直接将属性拉出:

  var id = JObject.Parse(s)["$id"]; var obj = JsonConvert.DeserializeObject(s); obj.id = id;