使用Newtonsoft.Json的JsonConvert.DeserializeObject <string>(jsonString)反序列化JSON

时间:2015-07-26 17:37:24

标签: c# json serialization

我一直在使用泛型和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生成时反序列化字符串?

2 个答案:

答案 0 :(得分:1)

json中的

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);