如何从JToken填充现有对象(使用Newtonsoft.Json)?

mik*_*ike 10 c# vb.net json

根据http://www.newtonsoft.com/json/help/html/PopulateObject.htm,您可以按JSON字符串中定义的值更新现有实例.我的问题是我必须填充对象的数据已经被解析为JToken对象.我目前的方法看起来像这样:

Private Sub updateTarget(value As JToken, target as DemoClass)
    Dim json As String = value.ToString(Formatting.None) 
    JsonConvert.PopulateObject(json, target)
End Sub
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来实现这一点,而不必"恢复"在创建JToken时已经完成的解析?

dbc*_*dbc 15

使用JToken.CreateReader()并通过读者JsonSerializer.Populate.返回的读者是一个JTokenReader迭代预先存在的JToken层次结构而不是序列化为字符串和解析的读者.

既然你标记了你的问题c#,这里有一个c#扩展方法来完成这项工作:

public static class JsonExtensions
{
    public static void Populate<T>(this JToken value, T target) where T : class
    {
        using (var sr = value.CreateReader())
        {
            JsonSerializer.CreateDefault().Populate(sr, target); // Uses the system default JsonSerializerSettings
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

认为这是等效的VB.NET:

Public Module JsonExtensions

    <System.Runtime.CompilerServices.Extension> 
    Public Sub Populate(Of T As Class)(value As JToken, target As T)
        Using sr = value.CreateReader()
            ' Uses the system default JsonSerializerSettings
            JsonSerializer.CreateDefault().Populate(sr, target)
        End Using
    End Sub

End Module 
Run Code Online (Sandbox Code Playgroud)