反序列化包含与关键字冲突的属性的JSON响应

时间:2011-01-12 16:14:16

标签: c# json json.net

有一个我无法控制的API,但是我需要使用C#消耗它的输出,最好是使用JSON.Net。

以下是一个示例回复:

[
    {
        "media_id": 36867, 
        "explicit": 0
    }
]

我曾计划过这样的课程:

class Media {
    public int media_id;
    public int explicit;
}

反序列化:

var l = JsonConvert.DeserializeObject<List<Media>>(s);

不幸的是,“explicit”是一个C#关键字,因此无法编译。

我的下一个猜测是修改课程:

class Media {
    public int media_id;
    public int explicit_;
}

...并以某种方式将响应属性映射到C#属性。

我该怎么做,或者我是否完全以错误的方式行事?

如果没有这个,如果有办法,我可以明白忽略回复中的“明确”吗?

3 个答案:

答案 0 :(得分:18)

没有使用JSON.Net,但是根据文档here来判断,我认为你只需要做你用XmlSerialization做的事情:添加一个属性来告诉如何调用JSON属性:

class Media {
    [JsonProperty("media_id")]
    public int MediaId;
    [JsonProperty("explicit")]
    public int Explicit;
}

答案 1 :(得分:11)

C#允许您通过使用@,例如

转义它们来定义具有保留字名称的成员(对于完全相同的互操作性情况)
class Media {
    public int media_id;
    public int @explicit;
}

不确定这是如何与JSON.Net一起播放的,但我认为它应该有用(因为@是一个转义,实际上并不是字段名称的一部分)。

答案 2 :(得分:1)

以下代码对我有用。

class JsonRpc {
  public string id;
  public string method;
  public string[] @params;
}
JsonConvert.DeserializeObject<JsonRpc> (data)

谢谢大家