0
votes

Existe-t-il un moyen de rendre JSON.NET désériorialiser à un type concret pour une propriété déclarée "objet"

Disons que j'ai un document JSON qui ressemble à ceci: xxx

et j'ai quelques pocos C # qui ressemblent à ceci: xxx

est là un moyen d'avoir json.net désérialisaliser le document tel que la propriété demandelog.requestpayload de type requierpayload , même si elle est déclarée Object ? L'objectif serait de revenir à requierpAyload afin de le manipuler, comme celui-ci: xxx

Je ne peux pas changer la déclaration de < Code> DemandeLog , comme dans un package Nuget, je ne contrôle pas. J'ai examiné la création d'un convertisseur personnalisé, et il semble que cela devrait être possible, mais je suis complètement intercepté de la sorte de le retirer.


5 commentaires

Pourquoi tapez-le comme objet au lieu de requierpayload ?


@Amy honnêtement, je ne suis pas sûr. Je pense que c'est parce que demandelog n'était vraiment pas destiné à être manipulé de cette façon, il est simplement censé être une DTO pour stocker des entrées de journalisation.


Si les classes désérialisées sont simples, créez peut-être une classe de copie que vous pouvez modifier. Puis automatiquement les récupérer sur les originaux.


@Chendunwachuku Vous pouvez utiliser "Dynamic" et les mettre à nouveau sur DemandPayload si vous ne pouvez pas l'affecter immédiatement.


@Chinmaykale Attention avec dynamique. L'exécution de la DLR est plus lente que l'exécution du CLR et tout ce qui touche n'importe quoi déclaré dynamique passera par la DLR.


3 Réponses :


-1
votes

Dans votre demande de demande code> classe,

Modifier: p> xxx pré>

à: p> xxx pré> Et vous pourrez ensuite l'utiliser après la désérialisation, sans avoir à le jeter: P>

var result = JsonConvert.DeserializeObject<RequestLog>(json, ...);
var requestPayload = result.RequestPayload;
// do other stuff with requestPayload here


4 commentaires

Je ne peux pas; C'est dans un paquet Nuget, je ne contrôle pas.


Et pourquoi cela importerait-il? Si vous avez référencé, ça devrait aller.


@Chendunwachuku Contrôlez-vous la définition de demandeLog ?


@ K.alanbates non je ne le fais pas. :(



1
votes

Si vous devez déclarer cette requestPrayload CODE> Propriété du DemandeLog code> sous forme d'objet code>, et que vous n'avez pas besoin de ce code pour être réutilisable, Vous pouvez brute la force cela.

JContainer json = GetMySerializedContentAsJson(content);
RequestPayload payload = JsonConvert.DeserializeObject<RequestPayload>(json["RequestPayload"]);
RequestLog log = JsonConvert.DeserializeObject<RequestLog>(json);
log.RequestPayload = payload;//=>you should now have your object.


0 commentaires

3
votes

Vous pouvez utiliser un convertisseur personnalisé pour votre DemandeLog CODE> Classe:

JsonConvert.DeserializeObject<RequestLog>(json, new JsonSerializerSettings
{
    Converters = new JsonConverter[] { new RequestLogConverter() }
});


1 commentaires

Merci! C'est exactement ce que j'espérais. :)