2016-09-09 34 views
0

json配列をオブジェクトに変換しようとするとエラーが発生します。私はこのように見えるオブジェクトを作成した。このことからjson配列からC#オブジェクトを作成

{ 
    "error":"0", 
    "result":{ 
     "activities":{ 
     "1":{ 
      "activity_id":"15803", 
      "activity_id_name":"Ashtanga vinyasa", 
      "schedule":{ 
       "1":{ 
        "available":"30", 
        "start":"09:00:00" 
       } 
      } 
     }, 
     "2":{ 
      "activity_id":"15804", 
      "activity_id_name":"Yin/Yang", 
      "schedule":{ 
       "1":{ 
        "available":"30", 
        "start":"10:30:00" 
       } 
      } 
     }, 
     "3":{ 
      "activity_id":"15805", 
      "activity_id_name":"Stress relief", 
      "schedule":{ 
       "1":{ 
        "available":"30", 
        "start":"20:00:00" 
       } 
      } 
     } 
     }, 
     "json_code":"2" 
    }, 
    "id":null 
} 

私はこのような複数の層を持つJSON配列を持つ

namespace LesRooster.Models 
{ 
    public class JsonGroup 
    { 
     public string Error { get; set; } 
     public List<Results> Result { get; set; } 
     public string Id { get; set; } 

    } 

    public class Results 
    { 
     public Activities YogaActivities { get; set; } 
     public int JsonCode { get; set; } 
    } 

    public class Activities 
    { 
     public int ActivityId { get; set; } 
     public string ActivityIdName { get; set; } 
     public Schedule LesSchedule { get; set; } 
    } 

    public class Schedule 
    { 
     public int Available { get; set; } 
     public DateTime Start { get; set; } 
    } 

} 

私はオブジェクトに配列を追加しよう

JsonGroup jgroup = JsonConvert.DeserializeObject<JsonGroup>(JsonArrayCode); 

次のエラーが表示されます。

現在のJSONオブジェクトを逆シリアル化できません(例: タイプにはJSON配列が必要です(例:[1,2,3])。 を正しく非直列化します。

これを解決する方法はありますか? mvc5アプリケーションのビューで渡すのは簡単なので、オブジェクトとして保持したいと考えています。

私はこれを検索しようとしましたが、私が見つけたすべての解決策は1次元json配列用です。

APIのドキュメントを次のように私はルックスからJSON配列を要求:

json_code integer 
Constant value: 2 
activities hash  
    { 
    index : { 
     activity_id: integer 
     activity_id_name: string 
     schedule: hash 
     { 
      index : { 
       available: integer 
       start: time 
       } 
      } 
     } 
} 
+2

エラーはまさにその通りです。 JSONには、*オブジェクト*を含むプロパティ 'result'があります。プロパティーには、より多くのプロパティを束ねた' activities'プロパティがあります。それは配列ではないので、それをどのようにして1に逆シリアル化するのですか? 'activities'を辞書に逆シリアル化することもできますし、独自のコンバータを記述してそのプロパティを扱うこともできます。 –

+0

JSONメッセージにはコレクションはありませんが、DTオブジェクトにはコレクションがあります。 – eocron

答えて

3

クラスの構造がJSONの構造と一致しないため、例外が発生します。 JSONの構造を反映するためにクラスをいくつか変更しました。

主な違いは、アクティビティがArrayではなく、Dictionaryではないという点です。

namespace LesRooster.Models 
{ 
    public class JsonGroup 
    { 
     public string Error { get; set; } 
     public Result Result { get; set; } 
     public string Id { get; set; } 

    } 

    public class Result { 
     public IDictionary<string, Activities> Activities {get; set;} 
     public int JsonCode {get; set;} 
    }   

    public class Activities 
    { 
     [JsonProperty("activity_id")] 
     public int ActivityId { get; set; } 
     [JsonProperty("activity_id_name")] 
     public string ActivityIdName { get; set; } 
     public IDictionary<string, Schedule> Schedule { get; set; } 
    } 

    public class Schedule 
    { 
     public int Available { get; set; } 
     public DateTime Start { get; set; } 
    }  
} 
+0

スケジュールもコレクションです – Plutonix

+0

@Plutonix:Thanx - むしろそれは辞書です。私は私の答えを更新します。私は、StartのDateTimeが正しいタイプであるかどうかをチェックしています。 –

+1

ActivityIdプロパティに '[JsonProperty(" activity_id_name ")]'を入れ、ActivityIdプロパティに '[JsonProperty(" activity_id ")]'を入れるか、https://migara.li/ 2016/01/09/json-net-easy-serialization/ –

-1

あなたはJSON.NETを試みたことがありますか?それはMITの許諾を受けています。

+1

この回答は、コードと受信したJSONメッセージとの間の不一致を解決するのに失敗します。 –

関連する問題