2016-12-13 3 views
0

Ich frage mich, ob es irgendwelche Beispiele dafür gibt, wie man einen benutzerdefinierten JsonConverter für asp net mit JSON.Net erstellt, der einen TextReader oder einen StreamReader statt nur einer Zeichenfolge verwendet. Zum Beispiel gibt es Beispiele wie diese http://www.newtonsoft.com/json/help/html/CustomJsonConverter.htm , die benutzerdefinierte JsonConvert Klasse verwenden:Benutzerdefinierter Json.Net-Konverter mit streamreader statt string

string json = 
"{ 
    "Keys": [ 
    "FirstName", 
    "LastName", 
    "Roles" 
    ], 
    "FirstName": "James", 
    "LastName": "Newton-King", 
    "Roles": [ 
    "Admin" 
    ] 
}" 
Employee newEmployee = JsonConvert.DeserializeObject<Employee>(json, new KeysJsonConverter(typeof(Employee))); 

aber ich frage mich, ob es möglich war, die json so deserialisieren, die einen Stromleser verwendet: http://www.newtonsoft.com/json/help/html/DeserializeWithJsonSerializerFromFile.htm

// deserialize JSON directly from a file 
using (StreamReader file = File.OpenText(@"c:\movie.json")) 
{ 
    JsonSerializer serializer = new JsonSerializer(); 
    // somehow make serializer use a custom JsonConverter 
    Movie movie2 = (Movie)serializer.Deserialize(file, typeof(Movie)); 
    // hoping that movie2 contains the custom converted json 
} 

Antwort

2

Sie können ein JsonSerializer konstruieren mit JsonSerializerSettings mit dem gewünschten Wandler: direkt aus dem Strom

var settings = new JsonSerializerSettings 
{ 
    Converters = { new KeysJsonConverter(typeof(Employee)) }, 
}; 
var serializer = JsonSerializer.CreateDefault(settings); 

dann den Serializer verwenden, wie Sie zur Zeit lesen tun.

Referenz: die Dokumentation für JsonSerializer.CreateDefault(JsonSerializerSettings).

Wenn Sie die global default settings nicht verwenden möchten, verwenden Sie stattdessen JsonSerializer.Create(JsonSerializerSettings). Jedoch JsonConvert.DeserializeObject<T>()tut verwenden Sie die globalen Standardwerte, so dass Wechsel von DeserializeObject<T> zu zu einer brechenden Änderung führen kann. Diese kleine Unterscheidung wird nicht in der documentation erwähnt, die Sie gefunden haben.

1

StreamReader verfügt über eine ReadToEnd() - Funktion, die eine Zeichenfolge zurückgibt.

string jsonString = file.ReadToEnd(); 
Movie movie2 = JsonConvert.DeserializeObject<Movie>(jsonString); 
+1

Dies würde definitiv helfen, weil Sie Eigenschaften, Werte, Arrays und ganze Objekte nicht in derselben Zeile haben könnten. Es als Stream zu lesen, könnte dir nur ein Stück von dem geben, wonach du suchst. – krillgar

+1

Vielen Dank für die Antwort! Ich denke, ich wollte die Verwendung von ReadToEnd vermeiden, weil ich die Zeichenfolge nicht in den Speicher bringen wollte, nur für den Fall, dass es sich um eine sehr lange Datei handelte. Ich werde dies jedoch im Hinterkopf behalten – James