JSON.NET反序列化特定属性

我有以下JSON文本:

 { "PropOne": { "Text": "Data" } "PropTwo": "Data2" } 

我想将PropOne反序列化为PropOne类型,而无需反序列化对象上的任何其他属性。 可以使用JSON.NET完成吗?

 public T GetFirstInstance(string propertyName, string json) { using (var stringReader = new StringReader(json)) using (var jsonReader = new JsonTextReader(stringReader)) { while (jsonReader.Read()) { if (jsonReader.TokenType == JsonToken.PropertyName && (string)jsonReader.Value == propertyName) { jsonReader.Read(); var serializer = new JsonSerializer(); return serializer.Deserialize(jsonReader); } } return default(T); } } public class MyType { public string Text { get; set; } } public void Test() { string json = "{ \"PropOne\": { \"Text\": \"Data\" }, \"PropTwo\": \"Data2\" }"; MyType myType = GetFirstInstance("PropOne", json); Debug.WriteLine(myType.Text); // "Data" } 

这种方法避免了必须反序列化整个对象。 但请注意,如果json 非常大,这只会提高性能,并且您要反序列化的属性在数据中相对较早。 否则,你应该只是反序列化整个事物并拉出你想要的部分,就像jcwrequests答案所示。

JSON不是太大,所以我会采用Matt Johnson的建议并对整个事件进行反序列化。 感谢jcwrequests的回答,我能够使用这个方法:

 var jObject = JObject.Parse(json); var jToken = jObject.GetValue("PropTwo"); PropTwoClass value = jToken.ToObject(typeof(PropTwoClass)); 
  var json = "{ "PropOne": { "Text": "Data" } "PropTwo": "Data2" }"; JObject o = JObject.Parse(json); var val = o.PropTwo; 

使用JSON Linq提供程序,您无需将对象反序列化为已知类型。

奥马尔答案的一个更简单的解决方案是拥有一个包装器。

 class Wrapper { public PropOneClass PropOne; } JsonConvert.Deserialize(json).PropOne 

我的测试发现它快了大约30%。

Matt的答案是迄今为止最快的解决方案,尽管它有一个bug。 这是我尝试解决这个问题。 此方法仅返回根级别的匹配属性。 在计算开始和结束标记时仍有一种天真的方法,但对于有效的JSON,它可能会起作用。

马特,随便把它复制到你的答案中。

 public T GetFirstInstance(string propertyName, string json) { using (var stringReader = new StringReader(json)) using (var jsonReader = new JsonTextReader(stringReader)) { int level = 0; while (jsonReader.Read()) { switch (jsonReader.TokenType) { case JsonToken.PropertyName: if (level != 1) break; if ((string)jsonReader.Value == propertyName) { jsonReader.Read(); return (T)jsonReader.Value; } break; case JsonToken.StartArray: case JsonToken.StartConstructor: case JsonToken.StartObject: level++; break; case JsonToken.EndArray: case JsonToken.EndConstructor: case JsonToken.EndObject: level--; break; } } return default(T); } } 

使用JsonIgnore – 这将导致Json.Net完全忽略该属性,用于序列化和反序列化。

另外,请检查此链接 。