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

use*_*281 6 .net 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; }
    }
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Str*_*ior 1

看起来这是 JSON.NET 中的一个错误,我认为你应该报告它。它在 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; }
}
Run Code Online (Sandbox Code Playgroud)

显然,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"}]
Run Code Online (Sandbox Code Playgroud)

尽管如此,它似乎应该让你捕捉到$id不过,如果您不使用引用处理,

作为解决方法,您可以将其解析为 JObject,然后直接提取属性:

    var id = JObject.Parse(s)["$id"];
    var obj = JsonConvert.DeserializeObject<DocData>(s);
    obj.id = id;
Run Code Online (Sandbox Code Playgroud)