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

时间:2014-05-11 01:26:21

标签: c# json json.net

对于我的unix / java朋友,我想发送换行符('\ n')而不是CRLF( '\ r \ n')在Json.Net中。我尝试将StreamWriter设置为使用换行而没有任何成功。

我认为 Json.Net 代码正在使用Environment.NewLine而不是调用TextWriter.WriteNewLine()。更改Environment.NewLine不是一个选项,因为我作为服务器运行,换行编码基于请求。

是否有某种其他方式来强制换取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
}

5 个答案:

答案 0 :(得分:8)

在深入研究Json.Net代码后,我发现问题出在JsonTextWriter.WriteIndent,感谢 Athari

而不是_writer.Write(Environment.NewLine);,它应该是_writer.WriteLine();

我已经向github发布了拉取请求。 https://github.com/JamesNK/Newtonsoft.Json/pull/271

答案 1 :(得分:6)

如果要自定义缩进空格,只需覆盖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();
        }
    }
}

答案 2 :(得分:1)

在线路协议上,就是一条线以crlf结尾。如果你觉得你真的必须这样做,那么后期处理是要走的路 - 把它写成一个字符串,然后在返回之前改变字符串。

请注意,对于我认为实际为负的内容,这是一个额外的处理。不推荐。

答案 3 :(得分:1)

我在这里看到几个配置序列化器的解决方案。但如果你想要快速和肮脏,只需用你想要的字符替换字符。毕竟,JSON只是一个字符串。

string json = JsonConvert.SerializeObject(myObject);
json = json.Replace("\r\n", "\n");

答案 4 :(得分:-2)

result = result.Replace(@“ \ r \ n”,“ \ n”);