我正在编写一个与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吗?
由于
答案 0 :(得分:1)
看起来这是JSON.NET中的一个错误,我认为你应该report it。它在LINQPad中适用于除$id
之外的任何属性名称。
void Main()
{
var s = JsonConvert.SerializeObject(new DocData{id = "hi", Name = "world"}).Dump();
JsonConvert.DeserializeObject<DocData>(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<DocData>(s);
obj.id = id;