如何将JObject反序列化为.NET对象

时间:2010-12-14 16:27:12

标签: .net json exception serialization json.net

我很高兴使用Newtonsoft JSON library。 例如,我将从.NET对象创建JObject,在这种情况下是Exception的实例(可能是也可能不是子类)

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

现在我知道库可以将JSON文本(即字符串)反序列化为对象

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

但我正在寻找的是:

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

很明显,我可以从JObject回到JSON文本,然后使用反序列化功能,但这似乎是我的反向。

3 个答案:

答案 0 :(得分:387)

根据这个post,现在好多了:

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

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

文档:Convert JSON to a Type

答案 1 :(得分:40)

从我发现的文档中

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

Person的类定义应与以下内容兼容:

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

修改

如果您使用的是最新版本的JSON.net ,则不需要自定义序列化,请参阅上面的TienDo答案(如果您赞成我,请查看以下内容:P),这更简洁。

答案 2 :(得分:0)

为时已晚,以防万一有人在寻找另一种方式:

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