2017-11-22 13 views
2

RestSharpとIRestResponse<T> response = client.Execute<T>(request)を使用して、さまざまなJSON構造体をさまざまなC#構造体に動的に移植しています。しかし、ある特定のJSONの結果は私にそれが開始され、ブラケットで終わるトラブルを与える...RestSharpを使用したC#構造体へのJSON配列の逆シリアル化

私のJSONが開始され、「[」と「]」の文字で終わるされています

[ 
    { 
    "first": "Adam", 
    "last": "Buzzo" 
    }, 
    { 
    "first": "Jeffrey", 
    "last": "Mosier" 
    } 
] 

私はしました作成されたこのクラスの構造:私は私の型Tに動的にデシリアライズするメソッド内RestSharpを使用

public class Person 
{ 
    public string first { get; set; } 
    public string last { get; set; } 
} 
public class Persons 
{ 
    public List<Person> person { get; set; } 
} 

...

IRestResponse<T> response = client.Execute<T>(request); 
return response; 

問題はTがあるとき、私はclient.Executeライン上でこのエラーが出るということです。

Unable to cast object of type 'RestSharp.JsonArray' to type 'System.Collections.Generic.IDictionary`2[System.String,System.Object]'.

私もJson.Netにしようと、このエラーを得た:

Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'Persons' because the type requires a JSON object (e.g. {\"name\":\"value\"}) to deserialize correctly.

最初の「[」文字があると、リスト人物にデシリアライズを試みました。エラーメッセージが表示されなくなり、「人物」レコードが正しく表示されましたが、それらはすべてnullです。 (私は名前のケーシングが同一であることを確認しました)ターゲットサーバから常に配列の要素が1つしかないので、 "Persons"へのバインディングが "List" 。

このJSONを逆シリアル化してに変換する正しい方法は何ですか?の人はIRestResponse<T> response = client.Execute<T>(request)という方法論の範囲内にありますか?

+3

に変更し、私は人をオブジェクトとして使用すると、一覧として直接デシリアライズしてはならないと思います。デシリアライザは、生のJSONの例では存在しない "person"というプロパティを見つけようとします。 –

+0

大きな助け、ロベルト!私の外側のリストクラスでさえまだJSONの名前が必要であったという事実は忘れてしまった。 – stackonfire

答えて

1

コメントに記載されているように、あなたのjsonは人の配列を保持しています。したがって、デシリアライズするターゲット構造はそれに一致する必要があります。 次のいずれかを使用します

var response = client.Execute<List<Person>>(request); 

か、Personsクラスを好む場合は、

public class Persons : List<Person> 
{ 
} 
+0

あなたとロベルトに感謝します。私のJSONは外部構造の名前を付けていないので、外部クラスに名前のあるメンバーを持つことを避けるためのクラス継承の考え方は素晴らしいです。出来た。 – stackonfire

関連する問題