2013-06-26 5 views
3

J'ai une recherche chaîne JSON quelque chose comme ceci:Json.Net désérialisation, en gardant certaines propriétés desordre

{ 
    "Bar": { 
     "Pressure":42, 
     "ServesDrinks":false 
    }, 
    "Baz":[ 
     { 
      "Pressure":9001, 
      "ServesDrinks":true 
     }, 
     { 
      "Pressure":0, 
      "ServesDrinks":false 
     } 
    ] 
} 

Et je voudrais désérialiser cela en une classe regardant quelque chose comme ceci:

public class Foo 
{ 
    public Bar Bar { get; set; } 

    /// <summary> 
    /// Raw serialized (un-de-serialized) json string of the Baz list 
    /// </summary> 
    public string Baz { get; set; } 
} 

Fondamentalement, ne pas dé-sérialiser la valeur de Baz et au lieu de stocker la chaîne brute. I.e. Je veux que la valeur de chaîne Baz après sérialisation être:

"[{\" \ pression ": 9001, \" ServesDrinks \ ": true}, {\" \ pression ": 0, \" ServesDrinks \ ": false}]"

J'utilise Json.Net mais je n'ai pas réussi à comprendre comment faire cela. Dans le cas idéal je voudrais juste mettre un attribut magique sur ma propriété Baz qui conserve le json brut.

Je l'ai vu une question similaire ici: Partially deserialize with JSON.NET, keeping some fields raw

Mais je ne comprends pas comment aller avec cette approche JObject.

(Si elle est de toute aide, je sais que les données que je veux retenir une liste)

Thankful pour toute aide!

+2

L'autre question suggère de changer le champ Baz en 'JObject', qui est un type générique pour représenter les objets JSON. Vous pouvez obtenir la chaîne JSON avec 'Baz.ToString()', et lui assigner 'JObject.parse (aJSONString)'. –

+0

Merci Jakub, mais je n'arrive pas à faire fonctionner ça. Je reçois une exception JsonReaderException: "Erreur lors de la lecture de la chaîne: jeton inattendu: StartArray. Chemin d'accès" Baz ", ligne 1, position 8." –

+0

Vous pouvez essayer 'JArray' à la place. J'ai regardé un peu la documentation JSON.Net, et il semble que 'JArray' est utilisé pour gérer les tableaux JS, et' JObject' ne fonctionne qu'avec les vrais objets JS ('{foo: ...}'). J'ai donné une réponse plus complète ci-dessous. –

Répondre

2

Sur la base de la réponse à l'autre question, il semble que la solution dans JSON.Net pour des cas comme cela est d'utiliser le type J* approprié et utiliser leurs méthodes ToString() et Parse() travailler avec la chaîne JSON.

Pour les listes JS, le type approprié semble être JArray, et non JObject, qui est utilisé pour les objets Javascript de style {}.

S'il vous plaît noter que je connais peu de JSON.Net, et peut-être il existe une solution différente qui permettrait d'éviter la nécessité d'utiliser Parse() et ToString() partout. Quelqu'un avec une meilleure connaissance de cette bibliothèque pourrait donner une meilleure réponse.

Questions connexes