自定义Json.Net转换器使用streamreader而不是字符串
问题描述:
我想知道是否有任何关于如何使用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
}
答
您可以构建使用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中没有提及此小区别。
答
StreamReader有一个ReadToEnd()函数,它返回一个字符串。
string jsonString = file.ReadToEnd();
Movie movie2 = JsonConvert.DeserializeObject<Movie>(jsonString);
这肯定会有所帮助,因为您可以使属性,值,数组和整个对象不在同一行内。以流的形式阅读它只会给你一些你正在寻找的东西。 – krillgar
谢谢你的回应!我想我想避免使用ReadToEnd,因为我不想将字符串带入内存,以防万一它是一个很长的文件。但我会记住这一点 – James