【问题标题】:How can I populate an existing object from a JToken (using Newtonsoft.Json)?如何从 JToken 填充现有对象(使用 Newtonsoft.Json)?
【发布时间】:2020-04-20 22:46:03
【问题描述】:

根据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

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

【问题讨论】:

    标签: c# json vb.net


    【解决方案1】:

    使用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
            }
        }
    }
    

    和 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 
    

    【讨论】:

    • 是的,那 is 确实是正确的 c#>vb 翻译。奇迹般有效!谢谢!
    • 为了改进一点,您可以将序列化程序作为参数获取,默认值为 null,然后使用默认序列化程序,如果为 null
    猜你喜欢
    • 2016-01-13
    • 2022-01-10
    • 2021-06-10
    • 2018-08-26
    • 2017-02-22
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多