自定义Json.Net转换器使用streamreader而不是字符串

时间:2016-12-13 23:14:10

标签: c# asp.net json json.net

我想知道是否有任何关于如何使用使用TextReader或StreamReader而不仅仅是字符串的JSON.Net为asp网制作自定义JsonConverter的示例。例如,有这样的例子http://www.newtonsoft.com/json/help/html/CustomJsonConverter.htm 使用自定义JsonConvert类:

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 个答案:

答案 0 :(得分:2)

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

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 :(得分:1)

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

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