JSON.NET反序列化特定属性

Oma*_*mar 26 c# json.net

我有以下JSON文字:

{
    "PropOne": {
        "Text": "Data"
    }
    "PropTwo": "Data2"
}    
Run Code Online (Sandbox Code Playgroud)

我想反序列PropOne化为类型PropOneClass而没有反序列化对象上任何其他属性的开销.可以使用JSON.NET完成吗?

Oma*_*mar 40

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

var jObject = JObject.Parse(json);
var jToken = jObject.GetValue("PropTwo");
PropTwoClass value = jToken.ToObject(typeof(PropTwoClass));
Run Code Online (Sandbox Code Playgroud)


Mat*_*int 33

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

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

  • 破坏此方法的原因在于,它将在任何级别的任何位置(而不仅仅是树的根)捕获第一个属性“ PropOne”。可以通过跟踪级别进行固定,并且仅在根级别接受正确的属性名称。 (2认同)

小智 7

 var json = "{ "PropOne": { "Text": "Data" } "PropTwo": "Data2" }";

 JObject o = JObject.Parse(json);
 var val = o.PropTwo;
Run Code Online (Sandbox Code Playgroud)

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


hul*_*ist 6

解决Omar问题的一个更简单的解决方案是使用包装器。

class Wrapper
{
    public PropOneClass PropOne;
}

JsonConvert.Deserialize<Wrapper>(json).PropOne
Run Code Online (Sandbox Code Playgroud)

我的测试发现它的速度提高了约30%。