2015-05-13 14 views
7

Zgodnie z http://www.newtonsoft.com/json/help/html/PopulateObject.htm można zaktualizować istniejącą instancję wartościami zdefiniowanymi w ciągu JSON. Mój problem polega na tym, że dane, które muszę wypełnić obiekt, zostały już sparsowane do obiektu JToken. Moje obecne podejście wygląda mniej więcej tak:Jak mogę wypełnić istniejący obiekt z JToken (przy użyciu Newtonsoft.Json)?

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

Czy istnieje lepszy sposób, aby osiągnąć ten cel bez konieczności „powrócić” do analizowania, która została już wykonana podczas tworzenia JToken w pierwszej kolejności?

Odpowiedz

11

Użyj JToken.CreateReader() i przekaż czytnik do JsonSerializer.Populate. Zwrócony czytnik to JTokenReader, który wykonuje iterację w istniejącej hierarchii JToken zamiast serializowania do łańcucha i parsowania.

Ponieważ określili swoje pytanie c#, oto metoda c# rozszerzenie, które spełnia swoje zadanie:

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

myślę jest to odpowiednik 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 
+0

Tak, że _jest_ rzeczywiście poprawne tłumaczenie C#> vb. Działa jak marzenie! Dziękuję Ci! – mike

Powiązane problemy