web-dev-qa-db-ja.com

JSON逆シリアル化タイプは、配列の逆シリアル化ではサポートされていません

逆シリアル化エラーに関する他の2つの投稿を読みましたが、どこにも行っていないので、自分の質問を投稿しています。

JSONを返すWCFサービスがあります。特定の型の逆シリアル化では、失敗します。

エラーを簡単に再現できるようにするために、呼び出しとともに以下のJSONをハードコーディングしました。

基本的に、以下のコードをコピーして貼り付けて、失敗することを確認できるはずです。

コンシューマーは、これを作業オブジェクトにデシリアライズする必要があります。 s.Deserializeは、タイトルに記載されているエラーメッセージで失敗します。

注:JSONにスラッシュがあることに気付きました。これらは、引用符をエスケープするために便利です。ありがとう。

サンプルコード:

  var s = new JavaScriptSerializer();

        var jstr =
            "[{\"UserId\":1,\"WorkoutId\":1,\"WorkoutInfo\":[\"Step 1\",\"Step 2\"]},{\"UserId\":2,\"WorkoutId\":2,\"WorkoutInfo\":[\"Step 1a\",\"Step 2a\"]},{\"UserId\":5,\"WorkoutId\":0,\"WorkoutInfo\":[\"new work1\",\"new work 1\",\"new work 1\"]}]";

        Workout blah = s.Deserialize<Workout>(jstr);
        var response = ServicePOST<Workout>("AddUserWorkout", workout);

およびワークアウトクラス:

public class Workout
{
    public int UserId { get; set; }
    public List<string> WorkoutInfo { get; set; }
}
18
tronious

問題は、シリアライザにそれがただのWorkoutであり、それらのリスト/配列ではないことを伝えていることです。これは動作します:

var blah = s.Deserialize<List<Workout>>(jstr);

これはあなたの質問に直接関係するものではありませんが、可能であれば、JavaScriptSerializerの代わりに Json.NET を使用することをお勧めします。

46
Tim S.