C # JSON.NET – Réponse de désérialisation utilisant une structure de données inhabituelle

J’ai quelques difficultés à trouver un moyen propre (comme possible) de désérialiser certaines données JSON dans un format particulier. Je souhaite désérialiser les données en classes d’objects de données fortement typées, ce qui est assez flexible en ce qui concerne les spécificités. Voici un exemple de ce à quoi ressemblent les données:

{ "timestamp": 1473730993, "total_players": 945, "max_score": 8961474, "players": { "Player1Username": [ 121, "somessortingng", 679900, 5, 4497, "anotherSsortingng", "thirdSsortingng", "fourthSsortingng", 123, 22, "YetAnotherSsortingng"], "Player2Username": [ 886, "stillAssortingng", 1677, 1, 9876, "alwaysAssortingng", "thirdSsortingng", "fourthSsortingng", 876, 77, "ssortingng"] } } 

Les parties spécifiques sur lesquelles je ne suis pas sûr sont:

  1. La collection de joueurs serait-elle considérée comme un dictionnaire? Le nom d’utilisateur pourrait servir de clé, mais la valeur me rejette car ce serait une collection mélangée de valeurs de chaîne et d’entier.
  2. Un joueur est composé entièrement de valeurs non nommées. J’ai à peu près toujours travaillé avec des données JSON ayant des propriétés et des valeurs nommées (par exemple, horodatage, total_players, etc. tout en haut)

Dites que j’ai un cours de haut niveau comme celui-ci:

 public class ScoreboardResults { public int timestamp { get; set; } public int total_players { get; set; } public int max_score { get; set; } public List players { get; set; } } 

À quoi ressemblerait l’object Player étant donné qu’il s’agit essentiellement d’une clé / valeur avec le nom d’utilisateur servant de clé et la valeur étant une collection d’entiers et de chaînes mélangés? Les données pour chaque élément de joueur sont toujours dans le même ordre, donc je sais que la première valeur de la collection est leur identifiant unique, la deuxième valeur est une description du joueur, etc. J’aimerais que la classe de joueur ressemble à ceci:

 public class Player { public ssortingng Username { get; set; } public int UniqueID { get; set; } public ssortingng PlayerDescription { get; set; } .... .... .... Following this pattern for all of the values in each player element .... .... } 

Je suis convaincu que l’utilisation de JSON.NET est assez simple, c’est pourquoi je voulais éviter toutes les idées que j’avais sur la façon de procéder. Ce que je suis venu avec aurait été peu élégant et probablement sujet aux erreurs dans une certaine mesure au cours du processus de sérialisation.

MODIFIER

Voici les classes générées lors de l’utilisation du passé en tant que classes JSON, comme suggéré par snow_FFFFFF :

 public class Rootobject { public int timestamp { get; set; } public int total_players { get; set; } public int max_score { get; set; } public Players players { get; set; } } public class Players { public object[] Player1Username { get; set; } public object[] Player2Username { get; set; } } 

Ce qui n’est pas clair pour moi, c’est comment désérialiser les données JSON dans l’élément “players” sous la forme d’une liste avec Player1Username étant une simple propriété de chaîne sur l’object Player. En ce qui concerne la collection de chaînes et de nombres entiers mélangés, je suis convaincu que je peux obtenir ces propriétés dans des propriétés individuelles de l’object Player sans problème.

Le convertisseur de désérialisation JSON dans Visual Basic .NET devrait faire ce que vous avez besoin, traduit correctement de VB.NET en c #:

 public class ObjectToArrayConverter : JsonConverter { public override bool CanConvert(Type objectType) { return typeof(T) == objectType; } static bool ShouldSkip(JsonProperty property) { return property.Ignored || !property.Readable || !property.Writable; } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { var type = value.GetType(); var contract = serializer.ContractResolver.ResolveContract(type) as JsonObjectContract; if (contract == null) throw new JsonSerializationException("invalid type " + type.FullName); var list = contract.Properties.Where(p => !ShouldSkip(p)).Select(p => p.ValueProvider.GetValue(value)); serializer.Serialize(writer, list); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.Null) return null; var token = JArray.Load(reader); var contract = serializer.ContractResolver.ResolveContract(objectType) as JsonObjectContract; if (contract == null) throw new JsonSerializationException("invalid type " + objectType.FullName); var value = existingValue ?? contract.DefaultCreator(); foreach (var pair in contract.Properties.Where(p => !ShouldSkip(p)).Zip(token, (p, v) => new { Value = v, Property = p })) { var propertyValue = pair.Value.ToObject(pair.Property.PropertyType, serializer); pair.Property.ValueProvider.SetValue(value, propertyValue); } return value; } } 

Ensuite, ajoutez le convertisseur à votre classe Player et indiquez l’ordre de chaque propriété à l’aide de JsonPropertyAtsortingbute.Order :

 [JsonConverter(typeof(ObjectToArrayConverter))] public class Player { [JsonProperty(Order = 1)] public int UniqueID { get; set; } [JsonProperty(Order = 2)] public ssortingng PlayerDescription { get; set; } // Other fields as required. } 

Enfin, déclarez votre object racine comme suit:

 public class ScoreboardResults { public int timestamp { get; set; } public int total_players { get; set; } public int max_score { get; set; } public Dictionary players { get; set; } } 

Notez que j’ai déplacé Username de la classe Player vers le dictionnaire, en tant que clé.

Un bon moyen de commencer serait de laisser Visual Studio générer votre classe à partir du JSON. Ouvrez un fichier de classe vide et allez dans EDITER -> PASTE SPECIAL -> PASTE JSON As CLASSES.

Cela générera un fichier avec les classes nécessaires pour sérialiser / désérialiser votre JSON.

Essaye ça

Créez une classe comme ci-dessous

Remarque: vous pouvez utiliser l’option Collage spécial dans Visual Studio pour générer toutes les classes liées au fichier JSON.

Édition -> Collage spécial -> Coller Json en tant que classes

il créera toutes les classes liées au JSON

Note: référez – vous, j’ai déjà répondu semblable comme ceci ..