【问题标题】:Json.NET: Deserilization with Double QuotesJson.NET:使用双引号进行反序列化
【发布时间】:2011-11-13 03:50:24
【问题描述】:

我正在尝试反序列化作为服务响应接收到的 json 字符串。客户端是 C# 中的 Windows Phone 7。我正在使用Json .NET - James Newton-King deserializor 将Json 字符串直接转换为对象。但有时 Json 字符串中包含一些带有双引号 (") 的 cmets 信息,并且反序列化器失败并抛出错误。根据Jsonlint 看起来这是一个无效的 Json 字符串。

{
    "Name": "A1",
    "Description": "description of the "object" A1"
}

如何处理这样的 Json 字符串。如果是 (\"),那么它可以工作。但是我不能将所有 (") 替换为 (\"),因为 json 字符串的其他部分可能有双引号。Json .Net 是否有任何解码功能?

【问题讨论】:

  • 尝试使用自定义反序列化 这篇文章在 SO 中可能对您有所帮助[如何在反序列化之前将 json 对象转换为自定义类型?][1] [1]:stackoverflow.com/questions/6975789/…

标签: c# json double-quotes json.net


【解决方案1】:

看起来 HttpUtility.JavaScriptStringEncode 可能会解决您的问题。

HttpUtility.JavaScriptStringEncode(JsonConvert.SerializeObject(yourObject))

【讨论】:

    【解决方案2】:

    只要做:

    yourJsonString = yourJsonString.Replace("\"", "\\u022");
    object o = JSonConvert.Deserialize(yourJsonString);
    

    \u022 是双引号的 ascii 代码。因此,替换 \u022 的引号将被您的浏览器识别。

    并在“\u022”中使用\让c#识别反斜杠字符。

    干杯

    【讨论】:

      【解决方案3】:

      您可以改进这一点。

          static private T CleanJson<T>(string jsonData)
          {
              var json = jsonData.Replace("\t", "").Replace("\r\n", "");
              var loop = true;
              do
              {
                  try
                  {
                      var m = JsonConvert.DeserializeObject<T>(json);
                      loop = false;
                  }
                  catch (JsonReaderException ex)
                  {
                      var position = ex.LinePosition;
                      var invalidChar = json.Substring(position - 2, 2);
                      invalidChar = invalidChar.Replace("\"", "'");
                      json = $"{json.Substring(0, position -1)}{invalidChar}{json.Substring(position)}";
                  }
              } while (loop);
              return JsonConvert.DeserializeObject<T>(json);
          }
      

      示例;

      var item = CleanJson<ModelItem>(jsonString);
      

      【讨论】:

      • 非常好的解决方案。它应该被认为是正确的答案。
      【解决方案4】:

      我遇到了同样的问题,我找到了可能的解决方案。这个想法是捕捉 JsonReaderException。此异常为您带来属性“LinePosition”。您可以将此位置替换为空字符 (' ')。然后,您递归地使用此方法,直到整个 json 被修复。 这是我的例子:

      private JToken processJsonString(string data, int failPosition)
              {
                  string json = "";
                  var doubleQuote = "\"";
      
                  try
                  {
                      var jsonChars = data.ToCharArray();
      
                      if (jsonChars[failPosition - 1].ToString().Equals(doubleQuote))
                      {
                          jsonChars[failPosition - 1] = ' ';
                      }
      
                      json = new string(jsonChars);
      
                      return JToken.Parse(json);
                  }
                  catch(JsonReaderException jsonException)
                  {
                      return this.processJsonString(json, jsonException.LinePosition);
                  }               
              }
      

      希望你喜欢。

      【讨论】:

        【解决方案5】:

        我建议给服务器管理员/网站管理员写电子邮件,并要求他们使用 json 解决此问题。

        但如果这是不可能的,您可以编写简单的解析,在双引号内找到非转义的双引号并将它们转义。它几乎不会超过 20 行代码。

        【讨论】:

        • 您好,您能帮忙提一下建议吗?您是在谈论正则表达式吗?
        • 写出这些行会受到很多人的欢迎。
        【解决方案6】:

        您可以使用 newtonsoft 库将其转换为对象(将 \" 替换为 "):

        dynamic o = JObject.Parse(jsondata);
        return Json(o);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-30
          • 1970-01-01
          • 1970-01-01
          • 2011-12-30
          相关资源
          最近更新 更多