我正在使用JSON获取System.Net.WebResponse,然后在通过调用StringBuilder.ToString()方法获取响应结果之前将响应读入StringBuilder。我无法使用Newtonsoft.Json.Linq.JObject.Parse(repsonse)解析这样的respsone;
我的问题是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()返回字符串构建器所持有的文字表示,这样就不会考虑特殊字符。如果可能的话,特别是'{'和'}'字符。
答案 0 :(得分:2)
通过执行以下操作,我反驳了您原来的假设:
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)