C# 在Json.Net中生成换行而不是CRLF
对于我的unix/java朋友,我希望发送换行符('\n'),而不是CRLF( Json.Net中的“\r\n”)。我尝试设置StreamWriter使用新行,但没有成功 我认为Json.Net代码正在使用C# 在Json.Net中生成换行而不是CRLF,c#,json,json.net,C#,Json,Json.net,对于我的unix/java朋友,我希望发送换行符('\n'),而不是CRLF( Json.Net中的“\r\n”)。我尝试设置StreamWriter使用新行,但没有成功 我认为Json.Net代码正在使用Environment.NewLine而不是调用TextWriter.WriteNewLine()。更改环境。不能选择换行,因为我是作为服务器运行的,换行编码基于请求 是否有其他方法强制crlf换行 这是我的密码- using (var streamWriter = new StreamWri
Environment.NewLine
而不是调用TextWriter.WriteNewLine()
。更改环境。不能选择换行,因为我是作为服务器运行的,换行编码基于请求
是否有其他方法强制crlf换行
这是我的密码-
using (var streamWriter = new StreamWriter(writeStream, new UTF8Encoding(false))
{
NewLine = "\n"
})
using (var jsonWriter = new JsonTextWriter(streamWriter)
{
CloseOutput = true,
Indentation = 2,
Formatting = Formatting.Indented
})
{
// serialise object to JSON
}
在有线协议中,几乎所有的事情都是以crlf结束的。如果您觉得确实必须这样做,那么后处理就是一种方法——将其写入字符串,然后在返回之前更改字符串
请注意,这是一个额外的处理,我认为是一个实际的负。不建议使用。如果要自定义缩进空格,只需覆盖JsonTextWriter.WriteIndent
:
public class JsonTextWriterEx : JsonTextWriter
{
public string NewLine { get; set; }
public JsonTextWriterEx (TextWriter textWriter) : base(textWriter)
{
NewLine = Environment.NewLine;
}
protected override void WriteIndent ()
{
if (Formatting == Formatting.Indented) {
WriteWhitespace(NewLine);
int currentIndentCount = Top * Indentation;
for (int i = 0; i < currentIndentCount; i++)
WriteIndentSpace();
}
}
}
公共类JsonTextWriterEx:JsonTextWriter
{
公共字符串换行符{get;set;}
公共JsonTextWriterEx(TextWriter):基本(TextWriter)
{
NewLine=Environment.NewLine;
}
受保护的重写void WriteIndent()
{
if(格式化==格式化.缩进){
写空白(换行符);
int currentIndentCount=顶部*缩进;
对于(int i=0;i
在深入研究Json.Net代码之后,我发现问题出在JsonTextWriter.WriteIndent
,谢谢Athari
而不是\u writer.Write(Environment.NewLine)代码>应该是\u writer.WriteLine()代码>
我已经向github发布了一个拉取请求 我在这里看到了几个配置序列化程序的解决方案。但是如果你想要快速和肮脏,只要用你想要的替换字符就行了。毕竟,JSON只是一个字符串
string json = JsonConvert.SerializeObject(myObject);
json = json.Replace("\r\n", "\n");
我知道这是一个老问题,但我很难得到公认的答案来工作,并保持适当的缩进格式。另外,我也没有创建一个覆盖来实现这一点
以下是我如何使其正确工作的:
我假设此问题中引用的代码允许序列化程序遵守StringWriter
上的NewLine
设置。result=result.Replace(@“\r\n”和“\n”) 如果“换行编码基于请求”-为什么unix客户端不将其设置为LF?String.chr(13)+String.chr(10)如何?@Isantipov,Environment.newline
是一个全局(静态)变量。在服务器中,我有多个线程在运行;不要介意async
co例程。我需要一个指定换行符字符串的本地化方法。@AnthonyHorne,谢谢,但我使用的是c#而不是VB,我已经知道如何将CRLF表示为字符串。@RichardSchneider表示歉意-试图在黑暗中帮助拍摄一些镜头。我同意HTTP是基于CRLF的。然而,我的朋友们正在使用的许多工具都无法找到CRLF。我只是想让他们的生活更轻松些。但我想做的是不必为Json.Net编写代码,只需配置serialiser即可。我真的不想为另一个包维护代码。@RichardSchneider Json.NET使用Environment.NewLine
进行格式化,所以没有其他方法。你可以尝试在问题跟踪器中建议这种定制。快速而肮脏是正确的。我正在寻找配置serialiser的解决方案。这个解决方案会对服务器造成性能损失,我不愿意接受。但是谢谢你,理查德施耐德,是什么让你认为它会对你的表现造成惩罚呢。我认为SerializeObject
比string.Replace
慢得多。为了得到有用的答案,这个反应需要扩展。解释为什么这是问题的答案。这个答案不需要额外的解释。坦率地说(我很抱歉),它应该被删除。它没有投入太多的精力,更重要的是,它只是复制了大约四年前已经给出的答案(stackoverflow.com/a/23588433/2819245),而没有添加任何有价值的东西(另外,它错误地使用了逐字字符串文字)。看着这个,我只能想“为什么?”
using (var writer = new StringWriter())
{
writer.NewLine = "\r\n";
var serializer = JsonSerializer.Create(
new JsonSerializerSettings
{
Formatting = Formatting.Indented
});
serializer.Serialize(writer, data);
// do something with the written string
}