【问题标题】:deserialize json in C# with illegal variable characters使用非法变量字符在 C# 中反序列化 json
【发布时间】:2013-12-04 06:47:05
【问题描述】:

我正在编写一个与 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 吗?

谢谢

【问题讨论】:

标签: c# .net json


【解决方案1】:

看起来这是 JSON.NET 中的一个错误,我认为您应该 report it。对于除$id 之外的任何属性名称,它在LINQPad 中都可以正常工作。

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;

【讨论】:

  • 哈,我的运气。我想(希望)以 $ 作为主角是非常罕见的情况。也许我也可以让服务开发人员改变这一点,或者解释他们为什么想要这样。谢谢
  • @user3063281:事实证明,它比这更具体。 JSON.NET 显然使用$id 作为保留名称来帮助它处理对象引用。见stackoverflow.com/questions/11542144/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-09
  • 2021-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-16
相关资源
最近更新 更多