【问题标题】:stringbuilder to not escape curly bracketsstringbuilder 不转义大括号
【发布时间】:2012-08-01 04:18:58
【问题描述】:

我正在使用 JSON 获取 System.Net.WebResponse,然后将响应读取到 StringBuilder 中,然后通过调用 StringBuilder.ToString() 方法获取响应结果。我无法使用 Newtonsoft.Json.Linq.JObject.Parse(repsonse); 解析这样的响应;

我的问题是 ToString() 方法正在删除我的“{”和“}”字符,因为除非与另一个“{”匹配,否则它们会被转义。即使我做了一个 StringBuilder.Replace("{", "{{") 它也不起作用,因为最后的括号转义了第一个括号 --> 下面的示例

我获取响应的代码是:

public static string GetResponseFromRequest(string url){       

        System.Net.WebRequest req = System.Net.WebRequest.Create(url);
        System.Net.WebResponse res = req.GetResponse();
        System.Text.StringBuilder sb = new System.Text.StringBuilder();

        byte[] read = new byte[256];
        int count = res.GetResponseStream().Read(read, 0, 256);
        while (count > 0)
        {
            sb.Append(System.Text.ASCIIEncoding.ASCII.GetString(read));
            count = res.GetResponseStream().Read(read, 0, 256);
        }
        res.GetResponseStream().Close();

        res.Close();

        return sb.ToString();
    }

这是我的回复的示例:

{{ 
"id" : "myID",
"Name" : "MyDisplayName",
"description" : "A, MyDescription",
}"hasOverview" : true,
"hasDescription" : true,
  }

在调用 StringBuilder.ToString 之后,它看起来像这样:

 "{ 
    "id" : "myID",
    "Name" : "MyDisplayName",
    "description" : "A, MyDescription",
   }"hasOverview" : true,
    "hasDescription" : true,
      "

如果我调用 StringBuilder.Replace("{", "{{") 和 StringBuilder.Replace("}", "}}") 我会得到:

"{{ 
    "id" : "myID",
    "Name" : "MyDisplayName",
    "description" : "A, MyDescription",
   }}"hasOverview" : true,
    "hasDescription" : true,
      "

我需要一种方法来告诉 ToString() 返回字符串生成器所持有内容的文字表示,因此它不会考虑特殊字符。如果可能的话,特别是 '{' 和 '}' 字符。

【问题讨论】:

  • StringBuilder 永远不会修改字符。
  • @JohnSaunders 如果您使用 AppendFormat 方法(替换格式化占位符,看起来像是 OP 正在运行),它会做得很好。但我必须假设 OP 没有这样做。
  • StringBuilder 不会转义括号。您怎么知道在调用 StringBuilder.ToString 之前的响应是什么样的?你确定你的例子中没有去掉一些相关的代码部分吗?
  • 如果这听起来很刻薄,我很抱歉-我在上面吹毛求疵:-) 我只说“我假设...”因为 OP 的代码没有按照发布的方式编译(@987654326 中没有返回语句@),所以我认为它以某种方式被编辑了,也许我们没有看到真正的问题。
  • @ChrisShain 这并不刻薄。它的意思是“return sb.ToString(); 这是一个非常糟糕的错字,所以我会修复它。

标签: c# .net json


【解决方案1】:

我通过以下操作反驳了您最初的假设:

public static void TestSB()
{
    var testValue = "{{ \"id\" : \"myID\", \"Name\" : \"MyDisplayName\", \"description\" : \"A, MyDescription\", }\"hasOverview\" : true, \"hasDescription\" : true, }";
    var sb = new StringBuilder();
    sb.Append(testValue);
    var sbToString = sb.ToString();

    // Prints true
    Console.WriteLine(sbToString.Equals(testValue));
}

因此,我认为问题在于您试图一次将文本转换为 256 个字节,并在此过程中破坏字符。框架中有一些类是为您尝试完成的任务而设计的,即从 Stream 中读取文本。试试这个:

public static string GetResponseFromRequest(string url)
{
    var req = System.Net.WebRequest.Create(url);
    using (var res = req.GetResponse())
    using (var sr = new StreamReader(res.GetResponseStream()))
        return sr.ReadToEnd();
}

我用下面的方法测试过,结果看起来还可以:

public static void TestGetResponse()
{
    Console.Out.WriteLine(GetResponseFromRequest("http://www.google.com"));
}

编辑:

或者更好,

var result = new System.Net.WebClient().DownloadString(url)

【讨论】:

  • 你是对的。一点一点地添加它们会导致我在移除花括号时遇到的问题。还要感谢指向 WebClient 类的指针。使用起来好多了。
猜你喜欢
  • 2014-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 2011-04-15
  • 2013-05-07
  • 1970-01-01
相关资源
最近更新 更多