Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Json.Net中生成换行而不是CRLF_C#_Json_Json.net - Fatal编程技术网

C# 在Json.Net中生成换行而不是CRLF

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

对于我的unix/java朋友,我希望发送换行符('\n'),而不是CRLF( Json.Net中的“\r\n”)。我尝试设置StreamWriter使用新行,但没有成功

我认为Json.Net代码正在使用
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
}