我有以下JSON
文字:
{
"PropOne": {
"Text": "Data"
}
"PropTwo": "Data2"
}
我希望将PropOne
反序列化为类型PropOneClass
,而无需反序列化对象上的任何其他属性。可以使用JSON.NET完成吗?
答案 0 :(得分:38)
JSON不是太大,所以我会采用Matt Johnson的建议并对整个事件进行反序列化。感谢jcwrequests答案,我能够使用这种方法:
var jObject = JObject.Parse(json);
var jToken = jObject.GetValue("PropTwo");
PropTwoClass value = jToken.ToObject(typeof(PropTwoClass));
答案 1 :(得分:32)
public T GetFirstInstance<T>(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<T>(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<MyType>("PropOne", json);
Debug.WriteLine(myType.Text); // "Data"
}
这种方法避免了必须反序列化整个对象。但请注意,如果json 显着 大,这只会提高性能,并且您要反序列化的属性在数据中相对较早。否则,您应该只是反序列化整个事物并提取所需的部分,例如jcwrequests答案显示。
答案 2 :(得分:5)
var json = "{ "PropOne": { "Text": "Data" } "PropTwo": "Data2" }";
JObject o = JObject.Parse(json);
var val = o.PropTwo;
使用JSON Linq提供程序,您无需将对象反序列化为已知类型。
答案 3 :(得分:5)
A simpler solution to Omar's answer would be to have a wrapper.
class Wrapper
{
public PropOneClass PropOne;
}
JsonConvert.Deserialize<Wrapper>(json).PropOne
My tests found it to be about 30% faster.
答案 4 :(得分:1)
使用JsonIgnore
- 这将导致Json.Net完全忽略该属性,用于序列化和反序列化。
另外,请检查此link。