JObject to .NET nesnesinin serisini kaldırma


241

Mutlu bir şekilde Newtonsoft JSON kütüphanesini kullanıyorum . Örneğin, JObjectbir .NET nesnesinden, bu durumda bir İstisna örneği oluşturabilirim (bir alt sınıf olabilir veya olmayabilir)

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

şimdi kütüphane bir nesneye JSON metin (yani bir dize) serisini kaldırabilir biliyorum

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

ama aradığım şey:

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

JObjectArkadan JSON metnine gidip serileştirme işlevini kullanabileceğim açıktır , ancak bu bana geri görünüyor.

Yanıtlar:


489

Bu gönderiye göre , şimdi çok daha iyi:

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

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

Belgeler: JSON'u bir Türe Dönüştür


10
Buradaki performans sonuçları hakkında herhangi bir fikriniz var mı? Yansıma her seferinde kullanılacak mı?
Shaun Rowan

1
Bunu özel bir JsonConverter ile yapmak mümkün mü?
Justin Skiles

3
İpucu için teşekkürler. Bana çok yardımcı oldu. Bir şey eklememe izin verin: Türü kullandığım genel bir yöntemde T, result=(value is JObject) ? ((JObject)value).ToObject<T>() : (T)default(T);başarıyla dönüştürmek gibi bir şey gerekli (not - valuebir JObject veya başka bir şey olabilir bir veritabanından gelen bir nesne bu durumda sonuç null olmalıdır).
Matt

@ShaunRowan Linqpad'de kod ile uğraşırken, yansımayı özelliği JSON nesnesindeki karşılık gelen alanla aynı hedef nesnenin aynı "düzeyinde" eşleştirmek için kullanılır gibi görünüyor. Mülkünüzün adı JSON alanının adıyla eşleşmelidir ve mülkünüzün türü uyumlu bir tür olmalıdır.
BobbyA

ve jobject.ToObject(myObject.GetType())nesne türünü bilmiyorsanız kullanın .
Tohid

45

Belgelerden bunu buldum

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);

İçin sınıf tanımı Personaşağıdakilerle uyumlu olmalıdır:

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

Düzenle

JSON.net'in son bir sürümünü kullanıyorsanız ve özel serileştirmeye gerek duymuyorsanız, lütfen daha özlü olan yukarıdaki TienDo'nun cevabına (ya da beni oylarsanız: P) aşağıya bakın.


2
Özel serileştirme ayarlarını geçebilmek için stenografi yerine bu yaklaşımı kullanmam gerekiyordu.
Justin Caldicott

Aradığım tam ans
Mark-VII

2

Çok geç, birisinin başka bir yol araması durumunda:

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; }
}

Bu tam olarak kabul edilen cevaba benziyor .
jpaugh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.