Как я могу заполнить существующий объект из JToken (используя Newtonsoft.В 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

есть ли лучший способ выполнить это, не "возвращая" синтаксический анализ, который уже был сделан при создании JToken в первом место?

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