2017-02-23 13 views
3

私は、次のデータモデル私はトラブルシリアライズを有するjson.net newtsoftを使用してデシリアライズしています複雑なデータモデルとjson.net serizalization問題

class Tournament{ 
    int Id { get; set;} 
    ICollection<League> Leagues { get; set;} 
} 

class League{ 
    int Id {get;set;}; 
    Tournament Parent { get; set;} 
    ICollection<Player> Players { get; set;} 
    ICollection<Round> { get; set;} 
} 
class Player{ 
    int Id { get; set;} 
    League Parent { get; set;} 
    ICollection<Game> Games { get; set;} 
} 
class Round{ 
    int Id { get; set;} 
    ICollection<Game> Games { get; set;} 
    League Parent { get; set;} 
} 

class Game{ 
int Id { get; set;} 
Player playerOne { get; set;} 
Player playerTwo { get; set;} 
Round Parent { get; set;} 
} 

を持っています。

私は、次のJSONネット設定

JsonConvert.DefaultSettings =() => new JsonSerializerSettings 
     { 
     DateTimeZoneHandling = DateTimeZoneHandling.Local, 
     TypeNameHandling = TypeNameHandling.Objects, 
     Formatting = Formatting.Indented, 
     ReferenceLoopHandling = ReferenceLoopHandling.Serialize, 
     PreserveReferencesHandling = PreserveReferencesHandling.Objects, 
     }; 

しかし、あなたは、それは正しくない出力ファイルから見ることができるように、私はその希望を使用して、次のファイルhttps://api.myjson.com/bins/1aa4kl

を取得していますゲームストアプレイヤーやゲームへの参照は正しく参照されていません。そしてdesrizalingでは、リーグからトーナメントまでを除いて、親子関係のどれもマッピングされていません。

私はどのクラスにもデータ属性がありません。

誰かが間違っているとアドバイスできますか?データモデルを変更する必要がありますか?

public class JsonRoot 
{ 
    [JsonProperty("$id")] 
    public string Id_X { get; set; } 
    [JsonProperty("$type")] 
    public string Type_X { get; set; } 
    public bool UploadedToDatabase { get; set; } 
    public string Id { get; set; } 
    public bool TournamentStarted { get; set; } 
    public int MaximumNumberOfRounds { get; set; } 
    public string Name { get; set; } 
    public League[] Leagues { get; set; } 
    public object SaveFilePath { get; set; } 
    public object SavedFileName { get; set; } 
    public object DefaultPairingMethod { get; set; } 
    public int DefaultPairingLag { get; set; } 
    public bool IsTournamentRanked { get; set; } 
    public string UserId { get; set; } 
    public object StreamUrl { get; set; } 
    public string StartTime { get; set; } 
    public string EndTime { get; set; } 
    public int NumberOfPlacesForPrizes { get; set; } 
    public bool isTournamentDirector { get; set; } 
} 

[JsonProperty("$id")]ここで必要とされているが$がpropertynamesで許可されていません原因:

おかげ

+0

私はあなた 'JSON' [ここ](http://json2csharp.com/)貼り付けるとクラスは全く異なる探しています。これは、あなたの作業モデルを再作成するのに役立ちます。 –

+0

Felixに感謝します。私はそれをチェックしました。私のデータモデルとはまったく異なります。私はjsonのシリアライゼーションが非常に異なる理由は分かりません – Jack

+0

私はそれが単純化できると確信しています。例えば、 'PlayerTwo4'は' PlayerTwo3'と同じモデルにマップすることができます...それは少し異なりますが、 'Player'クラスに'変数(nullable) 'プロパティを追加することでこれを修正できると思います。 –

答えて

1

私はワーキングモデルを得ることができました!私は '親' probleを解決しようとしていた


public class League 
{ 
    [JsonProperty("$id")] 
    public string ID_X { get; set; } 
    [JsonProperty("$type")] 
    public string Type_X { get; set; } 
    public bool UploadedToDatabase { get; set; } 
    public string Id { get; set; } 
    public object Name { get; set; } 
    public int NumberOfRounds { get; set; } 
    public object Parent { get; set; } 
    public Player[] Players { get; set; } 
    public Round[] Rounds { get; set; } 
    public bool LeagueStarted { get; set; } 
    public object Prizes { get; set; } 
} 

public class Round 
{ 
    [JsonProperty("$id")] 
    public string ID_X { get; set; } 
    [JsonProperty("$type")] 
    public string Type_X { get; set; } 
    public bool UploadedToDatabase { get; set; } 
    public string Id { get; set; } 
    public object Parent { get; set; } 
    public List<Game> Games { get; set; } 
    public bool HasStarted { get; set; } 
    public string TimeStarted { get; set; } 
    public int RoundNumber { get; set; } 
} 

public class Game 
{ 
    [JsonProperty("$id")] 
    public string ID_X { get; set; } 
    [JsonProperty("$type")] 
    public string Type_X { get; set; } 
    public object Parent { get; set; } 
    public bool UploadedToDatabase { get; set; } 
    public string Id { get; set; } 
    public int TableNumber { get; set; } 
    public string PlayerOneId { get; set; } 
    public string PlayerTwoId { get; set; } 
    public object PlayerOne { get; set; } 
    public object PlayerTwo { get; set; } 
    public int PlayerOneScore { get; set; } 
    public int PlayerTwoScore { get; set; } 
    public object HighestScoringWord { get; set; } 
    public string ScoresSubmittedDateTime { get; set; } 
} 

public class Player 
{ 
    [JsonProperty("$id")] 
    public string ID_X { get; set; } 
    [JsonProperty("$type")] 
    public string Type_X { get; set; } 
    public bool UploadedToDatabase { get; set; } 
    public string Id { get; set; } 
    public object Parent { get; set; } 
    public List<Game> Games { get; set; } 
    public int PlayerId { get; set; } 
    public string FirstName { get; set; } 
    public string Lastname { get; set; } 
    public object Username { get; set; } 
    public object Email { get; set; } 
    public double Rating { get; set; } 
    public int PointsFor { get; set; } 
    public int PointsAgainst { get; set; } 
    public double NumberOfWins { get; set; } 
    public double NumberOfDraws { get; set; } 
    public double NumberOfLosses { get; set; } 
    public int Spread { get; set; } 
    public string FullName { get; set; } 
    public bool IsSelected { get; set; }  
} 

D:

public class Reference 
{ 
    [JsonProperty("$ref")] 
    public string ref_id { get; set; } 
} 

が、私が代わりにobjectを使用して終了...

私は確信している、これが改善することができるが、それはあなたの進むべき道を示すべきである。このようなMが、それはそれでシリアライズいません

あなたは、私がクラスにいくつかのoverride ToString()を追加することをお勧めしますdebugginについて... Guidとかで

string Idを置き換えることができます。そのようにテストされた

var test = JsonConvert.DeserializeObject<JsonRoot>(json); 
関連する問題