【问题标题】:JSON deserialization issue with double quotes带双引号的 JSON 反序列化问题
【发布时间】:2017-05-04 07:40:16
【问题描述】:

我正在尝试反序列化 JSON 字符串,但出现错误:

var response = jss.Deserialize<Dictionary<string,string>>(responseValue); 

我收到一个错误:

数组的反序列化不支持类型“System.String”。

我认为如果我将\" 更改为',错误将得到修复

这是字符串

"{\"data\":[],\"error\":1,\"error_msg\":\"找不到关联的 database\",\"message\":\"请检查您发送的sr_no\"}"

我想要这样

"{'data':[],'error':1,'error_msg':'找不到关联 database','message':'请检查你发送的sr_no'}"

我已经尝试过以下使用功能,但对我不起作用

responseValue.Replace("\"","'");

【问题讨论】:

  • 确定这就是字符串吗?看起来它只是它的调试器表示。另外,这看起来像是 JSON,为什么要对它进行奇怪的字符串操作(尤其是那些使其 invalid JSON),而不是正确地将其视为 JSON?
  • 您的代码有效dotnetfiddle.net/nwqUqM
  • 是的,它是一个调试器表示@JamesThorpe。实际发生的是我使用 var response = jss.Deserialize>(responseValue); 反序列化 josn但我得到一个错误,“类型'System.String'不支持数组的反序列化。”。
  • 在这种情况下,这看起来很像XY Problem - 为什么不问你的实际问题呢?
  • 我认为问题出在字符串中,因为当我像这样传递 json 时: var response = jss.Deserialize>("{'name':'John' ,'年龄':'23'}");那么这工作正常。所以我认为这是字符串操作的问题。

标签: c# string


【解决方案1】:

如果您期望同一变量发生变化,那么您需要使用返回的结果再次设置它。

responseValue = responseValue.Replace(@"\"","'");

【讨论】:

  • 这应该是.Replace(@"\""","'").Replace(@"""","'").Replace("\"","'")。当前代码无法编译。
  • 替换引号字符不会修复任何 Json 反序列化错误。但是,如果字符串包含嵌入的单引号,它可能会导致它们
  • 同意,但这个问题会从表面上看。 OP将从这个答案中得到他需要的东西。如何适应大局需要他来处理。
  • 从表面上看,这仍然没有任何帮助*因为 OP 已经正确替换了双引号 * 并且仍然存在问题 I have tried this using function as following but didn't work for me: responseValue.Replace("\"","'");。事实上,这个答案使用了错误的转义,不会编译
  • 那是在问题结束之前。如果是新查询,则需要提出新问题。
【解决方案2】:

试试这个:

String s = "{\"data\":[],\"error\":1,\"error_msg\":\"could not find associated database\",\"message\":\"Please check sr_no that you have sent\"}";

s= s.Replace("\"", "'");

【讨论】:

    【解决方案3】:
    string responseValue = "{\"data\":[],\"error\":1,\"error_msg\":\"could not find associated database\",\"message\":\"Please check sr_no that you have sent\"}";
    Console.WriteLine(responseValue.Replace("\"", "'"));
    

    Check the output

    如果要返回此值,则将其保存在变量中并返回该变量。希望我的回答对你有所帮助。如果有什么评论在下面。

    【讨论】:

      【解决方案4】:

      错误消息解释了问题:您正在尝试将包含数组属性的字符串反序列化为字符串字典。不能将数组放入字符串中,所以Type 'System.String' is not supported for deserialization of an array.

      具体来说,data 属性是一个空数组:

      'data':[]
      

      这与引号字符无关。 JSON 适用于单字符或双字符。

      您需要为反序列化提供适当的类型。您可以将属性反序列化为objectdynamic 或创建一个匹配 JSON 文本的类,例如:

      var response = jss.Deserialize<Dictionary<string,object>>(responseValue); 
      

      或者:

      class MyError
      {
          public string[] data{get;set;}
          public string error_msg {get;set;}
          public string message {get;set;}
      }
      
      var response = jss.Deserialize<MyError>(responseValue); 
      

      【讨论】:

        【解决方案5】:

        您可以改进这一点。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-01-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-02
          • 2021-06-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多