2011-01-12 39 views
10

冲突有一个API,我没有控制权,但其输出我需要用C#消耗,最好使用JSON.Net。含有反序列化JSON响应属性以关键字

下面是一个例子回应:

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

我本来计划有一个类,像这样:

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

和反序列化:

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

不幸的是, “明确的” 是一个C#关键字,所以这不能编译。

我的下一个猜测是修改类:

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

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

我应该怎么做,还是我完全在这个错误的方式去?

做不到这一点,我很确定,只是简单的忽略“明确”的回应,如果有一种方法可以做到这一点?

回答

17

没有使用JSON.Net,而是由文档here来看,我想,你只需要做你与XmlSerialization做什么:添加属性来告诉JSON属性如何应叫:

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

C#,您可以通过与@逃脱他们,例如定义与保留字名成员(互操作性的情况正是这样),

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

不知道如何玩弄JSON.Net,但我会想象它应该工作(因为@是一个转义,实际上并不是字段名称的一部分)。

+0

我明白你说什么,而是你可以提供一个链接到进一步的解释?我试过这种改变:“var x = new Media(); x.explicit = true;”不会编译,但“x。@ explicit = true”。 – 2011-01-12 17:03:07

+0

在你的代码,你可以使用“@explicit”。但是这会被编译为二进制文件中的“显式”实际名称。所以JSON.Net序列化/反序列化代码会看到“显式”,而不是“@explicit”。就像在代码中使用“\ n”一样,但它会被编译成二进制文件中的换行符。 – 2011-01-12 17:32:05

1

下面的代码为我工作。

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

谢谢大家