如何反序列化一个JObject到.NET对象

我很高兴使用Newtonsoft JSON库。 例如,我将从.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文本,然后使用反序列化功能,但这对我来说似乎是向后的。

265386 次浏览

从文档中,我发现:

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 而且不需要自定义序列化,请参阅Tien Do的回答是,它更简洁。

根据这个帖子,现在好多了:

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


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

文档:将JSON转换为类型

太晚了,以防有人正在寻找另一种方式:

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