2016-06-19 88 views
2

我使用Newtonsoft的JSON解析器來解析來自外部系統(外部系統不是.net,因此它們使用不同的序列化庫)的結果。如何用奇怪的數組解析這個JSON

JSON字符串看起來很有趣。該端點用於/客戶端,但不是返回一個客戶端資源數組,而是返回一個包含數組的命名對象。就像這樣:

{"Client": [{"ClientId":"TheId"}]} 

如果我嘗試反序列化到客戶端陣列,它失敗的異常:

Client[] clients = serializer.Deserialize<Client[]>(aReaderWithTheJson) 

例外:

無法反序列化當前的JSON對象...要解決此錯誤,請將JSON更改爲JSON數組(例如[1,2,3])或更改 反序列化類型,以使其成爲正常的.NET類型

我得到它通過創造一個人工的包裝類我的目標對象,像這樣成功反序列化:

class ClientArray 
{ 
    public Client[] Client {get;set;} 
} 

// then deserialize: 
var clientWrapper = serializer.Deserialize<ClientArray>(theReader); 
var client = clientWrapper.Client[0]; 

我的問題,雖然:雖然這個工程,是否有JSON.net的一些特徵我不知道應該看看(某種序列化助手,還是可以用我的DTO裝飾的屬性?)。

回答

3

你是對的。你有JSON格式良好的JSON。沒有什麼好笑的。

它返回打包/包裝在根對象中的客戶端資源數組。

{"Client": [{"ClientId":"TheId"}]} 

其決心,這...

public class Client 
{ 
    public string ClientId { get; set; } 
} 

public class RootObject // Same as you wrapper 
{ 
    public IList<Client> Client { get; set; } 
} 

當放置在JSON解串器像http://jsonutils.com

就像你最終會通過你的包裝對象想通了。

var clientWrapper = serializer.Deserialize<RootObject>(json); 
var clients = clientWrapper.Client; 

這看起來完全像你在你的問題。如果外部系統是如何提供數據的話,那麼沒有別的辦法可以做。