2011-01-12 23 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) 

謝謝大家