2016-06-19 8 views
2

私はNewtonsoftのJSONパーサーを使って外部システムの結果を解析しています(外部システムは.netではないので、別のシリアル化ライブラリを使用しています)。このJSONを奇妙な配列と解析する方法

JSON文字列は私にとって面白く見えます。エンドポイントは/ clients用ですが、クライアントリソースの配列を返す代わりに、配列を含む名前付きオブジェクトを返します。私は、クライアントの配列にそれをデシリアライズしようとした場合

{"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"}]} 

これまでその解決...あなたは最終的にあなたのラッパーオブジェクトを使用して考え出したと同じようにhttp://jsonutils.com

のようなJSONのデシリアライザに置か

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

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

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

これはあなたの質問とまったく同じです。それが外部システムがデータを提供している方法であれば、あなたが本当にやるべきことは他にありません。