我一直在使用泛型和Newtonsoft.Json的JsonConvert.DeserializeObject(jsonString)
的扩展方法序列化按预期工作
string value = string.Empty;
value = JsonConvert.SerializeObject(null); //"null"
value = JsonConvert.SerializeObject("null"); //"null"
value = JsonConvert.SerializeObject("value"); //"value"
value = JsonConvert.SerializeObject(""); //""
但是在尝试反序列化时
string result = string.Empty;
result = JsonConvert.DeserializeObject("null"); //null, ok
result = JsonConvert.DeserializeObject("value"); //throwing error, expecting "value"
result = JsonConvert.DeserializeObject(""); //throwing error, expecting string.empty
//错误:解析值时遇到意外的字符:v。路径'',第0行,第0位。
现在我在扩展方法上使用 TSource:new(),这样任何字符串返回类型都会被限制为
public static TSource ExecuteScriptForData(this IJavaScriptExecutor javaScriptExecutor, string script, params object[] args) where TSource : new ()
这不允许我在 TSource
上使用 IList,IPerson或ReadOnlyCollection 等界面现在有没有办法配置反序列化器,以便它能够在Serializer生成时反序列化字符串?
答案 0 :(得分:1)
value
没有任何意义。如果你希望你的结果是字符串的值,你必须把它放在qoutes:
string result = string.Empty;
result = JsonConvert.DeserializeObject<string>("null"); //null, ok
result = JsonConvert.DeserializeObject<string>("'value'"); // "value"
result = JsonConvert.DeserializeObject<string>("''"); // string.Empty
答案 1 :(得分:1)
现在有没有办法配置反序列化器,以便它能够在Serializer生成时反序列化字符串?
您可以使用 JsonSerializerSettings 的 TypeNameHandling 属性。
var settings = new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.All };
var str = JsonConvert.SerializeObject(null,settings);
var obj1 = JsonConvert.DeserializeObject(str, settings);
str = JsonConvert.SerializeObject("value", settings);
var obj2 = JsonConvert.DeserializeObject(str, settings);
str = JsonConvert.SerializeObject("", settings);
var obj3 = JsonConvert.DeserializeObject(str, settings);