La désérialisation polymorphes json classes sans informations de type à l'aide de json.net
Ce Imgur api appel renvoie une liste contenant les deux Image de la Galerie et Galerie Album classes représentées en JSON.
Je ne vois pas comment désérialiser automatiquement à l'aide de ces Json.NET étant donné qu'il n'y a pas de $type de propriété dire la deserializer la classe est destinée à être représentés. Il y a une propriété appelée "IsAlbum" qui peut être utilisée pour distinguer entre les deux.
Cette question semble montrer une méthode, mais on dirait un peu un hack.
Comment puis-je aller sur la désérialisation de ces classes? (à l'aide de C#, Json.NET).
Des Données De L'Échantillon:
Image De La Galerie
{
"id": "OUHDm",
"title": "My most recent drawing. Spent over 100 hours.",
...
"is_album": false
}
Galerie Album
{
"id": "lDRB2",
"title": "Imgur Office",
...
"is_album": true,
"images_count": 3,
"images": [
{
"id": "24nLu",
...
"link": "http://i.imgur.com/24nLu.jpg"
},
{
"id": "Ziz25",
...
"link": "http://i.imgur.com/Ziz25.jpg"
},
{
"id": "9tzW6",
...
"link": "http://i.imgur.com/9tzW6.jpg"
}
]
}
}
- Vous voulez prendre de la chaîne Json et le mettre dans des classes? Et je suis confus par ce que vous entendez par
there is no $type property
. - Oui, j'ai de la chaîne json et souhaitez désérialiser de classes C#. Json.NET semble utiliser une propriété appelée $type d'établir une distinction entre les différents types de détenus dans un tableau. Ces données n'ont pas cette propriété et utilise juste le 'IsAlbum la propriété.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez le faire assez facilement en créer un personnalisé
JsonConverter
pour gérer l'instanciation d'objet. En supposant que vous avez vos classes définies à quelque chose comme ceci:Vous permettra de créer la convertisseur comme ceci:
Voici un exemple de programme montrant le convertisseur dans l'action:
Et voici la sortie du programme ci-dessus:
Populate
approche au lieu deToObject
. Voir les réponses à stackoverflow.com/questions/25404202/... et stackoverflow.com/questions/29124126/... . J'ai un exemple de ces deux approches dans un Résumé ici: gist.github.com/chrisoldwood/b604d69543a5fe5896a94409058c7a95 .Simplement avec JsonSubTypes attributs qui travaillent avec Json.NET
De mise en œuvre suivants devraient vous permettre de dé-sérialiser sans changer la façon dont vous avez conçu vos classes et par l'utilisation d'un champ autre que $type pour décider de la dé-sérialiser dans.
Avancé pour Brian Rogers réponse. Et à propos de "l'utilisation Sérialiseur.Remplir() à la place de l'élément.ToObject()".
Si les types dérivés a contstructors ou de certains de leurs est propre customconverter vous devez utiliser de manière générale pour désérialiser JSON.
Si vous devez quitter le travail pour instancier un nouvel objet à NewtonJson. De cette façon, vous pouvez l'obtenir en vous CustomJsonConverter:
Ce travail, si vous avez la récursivité des objets.
Je suis le seul à poster ce que pour dissiper une partie de la confusion. Si vous travaillez avec un format prédéfini et la nécessité de désérialiser, c'est ce que j'ai trouvé qui a le mieux fonctionné et démontre la mécanique afin que d'autres puissent le modifier au besoin.
[FromBody]
attribut?