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

Seb*_*ian 216 .net serialization json exception json.net

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

if (result is Exception)
    var jobjectInstance = JObject.FromObject(result);
Run Code Online (Sandbox Code Playgroud)

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

// only works for text (string)
Exception exception = JsonConvert.DeserializeObject<Exception>(jsontext); 
Run Code Online (Sandbox Code Playgroud)

但我要找的是:

// now i do already have an JObject instance
Exception exception = jobjectInstance.????
Run Code Online (Sandbox Code Playgroud)

很明显,我可以从JObject背面转到JSON文本,然后使用反序列化功能,但这似乎是我的倒退.

Tie*_* Do 434

根据这篇文章,它现在好多了:

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

// Copy to a static Album instance
Album album = jalbum.ToObject<Album>();
Run Code Online (Sandbox Code Playgroud)

文档:将JSON转换为类型

  • 有关性能影响的任何想法吗?每次都会使用反射吗? (10认同)
  • 谢谢你的提示.这对我帮助很大.让我添加一些东西:在我使用类型`T`的泛型方法中,我需要像`result =(value is JObject)这样的东西?((JObject)value).ToObject <T>():( T)default(T);`成功转换它(注意 - `value`是来自数据库的对象,可能是JObject或其他的案例结果应为null). (3认同)
  • 是否可以使用自定义 JsonConverter 来做到这一点? (2认同)

Seb*_*ian 41

从文档中我发现了这一点

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);
Run Code Online (Sandbox Code Playgroud)

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

class Person {
    public string Name { get; internal set; }
    public DateTime BirthDate { get; internal set; }
}
Run Code Online (Sandbox Code Playgroud)

编辑

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

  • 我需要使用这种方法(而不是简写形式)来传递自定义序列化设置。 (2认同)