我从带有编码字符的网络服务中获取JSON:\u201c
等。正如我解析它完美无缺:文本中的双引号具有编码字符值,而控制双引号没有编码,所以解析器看到正确的JSON结构。问题是我将它写入文件并读取后,它破坏了JSON。我在内容文本中不再有\u201c
个字符,而是"
个字符。
"
会更改为文件分隔符(28
)字符,而-
会更改为控制设备3(0x13
)并导致解析异常。"
会更改为?
个字符。"
将保持解码"
。有没有办法在写作和阅读后保留未编码的字符?
示例:
我使用的是Newtonsoft.Json.Linq
Encoding encoding = Encoding.GetEncoding("ISO-8859-1");
webResponse = (HttpWebResponse)webRequest.GetResponse();
using (StreamReader streamReader = new StreamReader(webResponse.GetResponseStream(), encoding))
{
responseString = streamReader.ReadToEnd();
}
JToken json = JObject.Parse(responseString);
using (StreamWriter stream = new StreamWriter(path, true, encoding))
{
stream.Write(json.ToString());
}
string spoiledJsonString = File.ReadAllText(path, encoding);
JToken sureNotToBeCreated = JObject.Parse(spoiledJsonString); // EXCEPTION
答案 0 :(得分:1)
如果我写测试程序,
using System;
using System.Diagnostics;
using System.IO;
using System.Text;
class Program
{
private static void Main()
{
var encoding = Encoding.GetEncoding("ISO-8859-1");
var testString = new string(new[] { (char)0x201c });
string roundTripped;
using (var m = new MemoryStream())
{
using(var writer = new StreamWriter(m, encoding))
{
var reader = new StreamReader(m, encoding);
writer.Write(testString);
writer.Flush();
m.Seek(0, SeekOrigin.Begin);
roundTripped = reader.ReadToEnd();
}
}
}
Debug.Assert(
string.Equals(testString, roundTripped),
"These strings should be equal.");
}
我重新创建了您的问题,报价已被转义。
如果我将编码更改为Encoding.UTF8
,则会成功运行。
作为supported here,ISO-8859-1不是Unicode字符集,因此编码Unicode是一个不错的选择。
作为supported here,JSON文本是Unicode。
所以我们可以推断,ISO-8859-1是编码JSON字符串的不错选择。
该计划,
using System;
using System.Diagnostics;
using System.IO;
using System.Text;
using Newtonsoft.Json.Linq;
class Program
{
private static void Main()
{
var encoding = Encoding.UTF8;
var testJson = new JObject
{
new JProperty(
"AQuote",
string(new[] { (char)0x201c }))
};
JObject roundTripped;
using (var m = new MemoryStream())
{
using(var writer = new StreamWriter(m, encoding))
{
var reader = new StreamReader(m, encoding);
writer.Write(testJson.ToString());
writer.Flush();
m.Seek(0, SeekOrigin.Begin);
roundTripped = JObject.Parse(reader.ReadToEnd());
}
}
}
Debug.Assert(
string.Equals(
testJson["AQuote"].Value<string>(),
roundTripped["AQuote"].Value<string>()),
"These strings should be equal.");
}
在没有警告的情况下运行,所以我怀疑你还有其他问题而不是UTF-8。