2016-12-13 66 views
0

我想知道是否有任何关于如何使用JSON.Net使用TextReader或StreamReader而不是一个字符串的自定义JsonConverter的例子。例如有像使用自定义JsonConvert类此http://www.newtonsoft.com/json/help/html/CustomJsonConverter.htm 例子:自定义Json.Net转换器使用streamreader而不是字符串

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

但是我想知道是否有可能反序列化这样的JSON它采用了流阅读: 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 
} 

回答

2

您可以构建使用JsonSerializerSettings与所需的转换器一个JsonSerializer

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

然后使用串行作为您目前正在做直接从流中读取。

参考文献:JsonSerializer.CreateDefault(JsonSerializerSettings)的文档。

如果您不想使用global default settings,请改为使用JsonSerializer.Create(JsonSerializerSettings)。但JsonConvert.DeserializeObject<T>()确实使用全局默认值,因此从DeserializeObject<T>切换到JsonSerializer.Create()可能会导致突变。在您找到的documentation中没有提及此小区别。

1

StreamReader有一个ReadToEnd()函数,它返回一个字符串。

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

这肯定会有所帮助,因为您可以使属性,值,数组和整个对象不在同一行内。以流的形式阅读它只会给你一些你正在寻找的东西。 – krillgar

+1

谢谢你的回应!我想我想避免使用ReadToEnd,因为我不想将字符串带入内存,以防万一它是一个很长的文件。但我会记住这一点 – James

相关问题