【问题标题】:Passing JSON, deserialization failed because of backslashs传递 JSON,反序列化因反斜杠而失败
【发布时间】:2015-12-23 16:07:31
【问题描述】:

试图在两个模块之间传递这个对象:

public class Transaction
{
    public string ID { get; set; }
    public string ErrorMessage { get; set; }
    public int ErrorCode { get; set; }
}

序列化:

transaction.ErrorMessage = "temptemptemp";
transaction.ErrorCode = 123;
transaction.ID = "0";
return Ok(JsonConvert.SerializeObject(transaction));

反序列化:

using (WebClient webClient = new WebClient())
{
    string json = webClient.DownloadString(url);
    Transaction transaction = JsonConvert.DeserializeObject<Transaction>(json);
}

在调试窗口中,我看到两个字符串是这样的:

  • 序列化后 - {"ID":"0","ErrorMessage":"temptemptemp","ErrorCode":123}
  • 反序列化之前 - "{\"ID\":\"0\",\"ErrorMessage\":\"temptemptemp\",\"ErrorCode\":123}"

所以我得到以下异常:

将值 "{"ID":"0","ErrorMessage":"temptemptemp","ErrorCode":123}" 转换为类型 'WebService.Transaction' 时出错。路径 '',第 1 行,位置 75。

【问题讨论】:

  • Ok() 方法有什么作用?
  • Ok() 函数返回一个System.Web.Http.Results.OkNegotiatedContentResult
  • 那些斜杠只是转义字符,这不应该影响到 JSON 的转换
  • 你确定是同一个 Transaction 类吗?
  • 我建议将 async/await 与 webclient 一起使用,因为 Tasks 适用于非 cpu 密集型工作,并且有助于扩展您的应用程序。

标签: c# json json.net backslash json-deserialization


【解决方案1】:

您正在对 transaction 对象进行双重序列化。首先,您通过手动调用将其序列化为 JSON 字符串

var jsonString = JsonConvert.SerializeObject(transaction);

然后你将它传递给Ok&lt;T&gt;(T content),它序列化它的传入值:

return Ok(jsonString);

由于传入的值是一个字符串,Ok() 将其转义为 JSON standard 要求的字符串文字表示。

相反,让 asp.net 为您序列化它:

return Ok(transaction);

如果要强制返回JSON,可以使用Json&lt;T&gt;(T content)

return Json(transaction);

【讨论】:

  • 我不知道Ok() 正在序列化对象,谢谢。
猜你喜欢
  • 2022-07-21
  • 1970-01-01
  • 2016-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-16
相关资源
最近更新 更多