it-swarm-eu.dev

Comment désérialiser un objet JObject en .NET

J'utilise volontiers la bibliothèque JSON Newtonsoft . Par exemple, je créerais un JObject à partir d'un objet .NET, dans ce cas une instance d'Exception (pourrait être une sous-classe) 

if (result is Exception)
    var jobjectInstance = JObject.FromObject(result);

maintenant, je sais que la bibliothèque peut désérialiser le texte JSON (c'est-à-dire une chaîne) en un objet

// only works for text (string)
Exception exception = JsonConvert.DeserializeObject<Exception>(jsontext); 

mais ce que je cherche, c'est:

// now i do already have an JObject instance
Exception exception = jobjectInstance.????

Il est clair que je peux revenir de JObject au texte JSON, puis utiliser la fonctionnalité de désérialisation, mais cela me semble en arrière.

182
Sebastian

Selon ce post , c'est beaucoup mieux maintenant:

// pick out one album
JObject jalbum = albums[0] as JObject;

// Copy to a static Album instance
Album album = jalbum.ToObject<Album>();

Documentation: Convertir JSON en un type

368
Tien Do

D'après la documentation, j'ai trouvé ceci

JObject o = new JObject(
   new JProperty("Name", "John Smith"),
   new JProperty("BirthDate", new DateTime(1983, 3, 20))
);

JsonSerializer serializer = new JsonSerializer();
Person p = (Person)serializer.Deserialize(new JTokenReader(o), typeof(Person));

Console.WriteLine(p.Name);

La définition de classe pour Person devrait être compatible avec les éléments suivants:

class Person {
    public string Name { get; internal set; }
    public DateTime BirthDate { get; internal set; }
}

Modifier

Si vous utilisez une version récente de JSON.net et que n'a pas besoin de la sérialisation personnalisée, veuillez consulter la réponse de TienDo ci-dessus (ou ci-dessous si vous me rediffusez: P), qui est plus concise.

40
Sebastian

Trop tard, juste au cas où quelqu'un chercherait un autre moyen:

void Main()
{
    string jsonString = @"{
  'Stores': [
    'Lambton Quay',
    'Willis Street'
  ],
  'Manufacturers': [
    {
      'Name': 'Acme Co',
      'Products': [
        {
          'Name': 'Anvil',
          'Price': 50
        }
      ]
    },
    {
      'Name': 'Contoso',
      'Products': [
        {
          'Name': 'Elbow Grease',
          'Price': 99.95
        },
        {
          'Name': 'Headlight Fluid',
          'Price': 4
        }
      ]
    }
  ]
}";

    Product product = new Product();
    //Serializing to Object
    Product obj = JObject.Parse(jsonString).SelectToken("$.Manufacturers[?(@.Name == 'Acme Co' && @.Name != 'Contoso')]").ToObject<Product>();

    Console.WriteLine(obj);
}


public class Product
{
    public string Name { get; set; }
    public decimal Price { get; set; }
}
0
Ivan Lopez