JSON.NET如何反序列化一个特定的属性?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (17)

我有以下JSON文字:

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

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

提问于
用户回答回答于
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 非常大,这只会提高性能,并且正在反序列化的属性在数据中相对较早。否则,你应该只是反序列化整个事情,并拉出你想要的部分。

用户回答回答于

JSON不是太大,所以我会反序列化整个事情。我能够使用这种方法:

var jObject = JObject.Parse(json);
var jToken = jObject.GetValue("PropTwo");
PropTwoClass value = jToken.ToObject(typeof(PropTwoClass));

扫码关注云+社区