【问题标题】:Deserialize JSON using Newtonsoft.Json's JsonConvert.DeserializeObject<string>(jsonString)使用 Newtonsoft.Json 的 JsonConvert.DeserializeObject<string>(jsonString) 反序列化 JSON
【发布时间】:2015-07-26 17:37:24
【问题描述】:

我一直在使用泛型和 Newtonsoft.Json 的 JsonConvert.DeserializeObject&lt;TSource&gt;(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. Path '', line 0, position 0.

现在我在扩展方法上使用TSource : new (),因此任何字符串返回类型都将被限制为

public static TSource ExecuteScriptForData(this IJavaScriptExecutor javaScriptExecutor, string script, params object[] args) where TSource : new ()

这不允许我在TSource 上使用IListIPersonReadOnlyCollection 等接口

现在有什么方法可以配置反序列化器,以便它能够在序列化器生成时反序列化字符串?

【问题讨论】:

  • 您尝试反序列化的内容不是有效的 json。如果它只是一个简单的字符串,为什么不按原样存储它。也许只有我一个人,但我没有看到您要解决的问题。
  • @Nasreddine 是的,它们不是有效的 json,但结果 = JsonConvert.DeserializeObject("null");正在工作,所以我想可能有某种方法。如果正如你所指出的,序列化不应该也会抛出错误吗!

标签: c# json serialization json-deserialization


【解决方案1】:

现在有什么方法可以配置反序列化器,使其能够在序列化器生成时反序列化字符串?

您可以使用 JsonSerializerSettingsTypeNameHandling 属性。

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

【讨论】:

  • this 和 little if/else 让事情按预期进行......谢谢!!
【解决方案2】:

value 在 json 中没有任何意义。如果您希望结果是字符串的值,则必须将其放在 qoutes 中:

string result = string.Empty;
result = JsonConvert.DeserializeObject<string>("null"); //null, ok
result = JsonConvert.DeserializeObject<string>("'value'"); // "value"
result = JsonConvert.DeserializeObject<string>("''"); // string.Empty

【讨论】:

  • 这很有趣,最合适的 var settings = new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.All };正在做那个@EZI
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-29
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
相关资源
最近更新 更多