簡體   English   中英

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

[英]Generating newlines instead of CRLFs in Json.Net

對於我的unix / java朋友,我想在Json.Net中發送換行符('\\ n')而不是CRLF('\\ r \\ n')。 我嘗試將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
}

在深入研究Json.Net代碼之后,我看到問題出在JsonTextWriter.WriteIndent ,感謝Athari

而不是_writer.Write(Environment.NewLine); 它應該是_writer.WriteLine();

我已經向github發布了拉取請求。 https://github.com/JamesNK/Newtonsoft.Json/pull/271

如果要自定義縮進空格,只需覆蓋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();
        }
    }
}

在線上的協議就是一條線以crlf結尾。 如果你覺得你真的必須這樣做,那么后期處理是可行的方法 - 將其寫入字符串然后在返回之前更改字符串。

請注意,對於我認為實際為負的內容,這是一個額外的處理。 不建議。

我在這里看到幾個配置序列化器的解決方案。 但如果你想要快速和骯臟,只需用你想要的字符替換字符。 畢竟,JSON只是一個字符串。

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

我知道這是一個老問題,但我很難得到工作中接受的答案並保持適當的縮進格式。 作為一個加號,我也沒有創建一個覆蓋來使這項工作。

以下是我如何使其正常工作:

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
}

我假設此問題中引用的代碼更改使得StringWriter上的NewLine設置能夠被序列化程序遵守。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM