mike mike - 1 year ago 96
JSON Question

How can I populate an existing object from a JToken (using Newtonsoft.Json)?

According to http://www.newtonsoft.com/json/help/html/PopulateObject.htm you can update an existing instance by values defined in a JSON-string. My problem is that the data I have to populate the object has already been parsed into a JToken object. My current approach looks something like this:

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

Is there a better way to accomplish this without having to "revert" the parsing that was already done when creating the JToken in the first place?

dbc dbc
Answer Source

Use JToken.CreateReader() and pass the reader to JsonSerializer.Populate. The reader returned is a JTokenReader which iterates through the pre-existing JToken hierarchy instead of serializing to a string and parsing.

Since you tagged your question c#, here's a c# extension method that does the job:

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

I think this is the equivalent VB.NET:

Public Module JsonExtensions

    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