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:
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 ..