2014-05-11 10 views
7

Für meine Unix/Java Freunde möchte ich Zeilenumbrüche ('\ n') anstelle von CRLF ( '\ r \ n') in Json.Net senden. Ich habe versucht, einen StreamWriter so einzustellen, dass er einen Zeilenumbruch ohne Erfolg verwendet.Generieren von Zeilenumbrüchen anstelle von CRLFs in Json.Net

Ich denke Json.Net Code verwendet Environment.NewLine statt TextWriter.WriteNewLine() aufrufen. Das Ändern von Environment.NewLine ist keine Option, da ich als ein Server ausgeführt werde und die Newline-Codierung auf der Anforderung basiert.

Gibt es einen anderen Weg Newline für crlf zwingen?

Hier ist mein Code -

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 
} 
+0

wenn die 'Newline-Codierung auf der Anfrage basiert.' - Warum wird LF für Unix-Clients nicht gesetzt? – Isantipov

+0

Was ist mit String.chr (13) + String.chr (10)? –

+3

@Isantipov, 'Environment.NewLine' ist eine globale (statische) Variable. Auf einem Server laufen mehrere Threads. "Asynchrone" Co-Routinen. Ich brauche eine lokalisierte Methode zur Angabe der Newline-Zeichenfolge. –

Antwort

5

Wenn Sie Einbuchtung Leerzeichen anpassen möchten, nur JsonTextWriter.WriteIndent außer Kraft setzen:

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(); 
     } 
    } 
} 
+0

+1 Gute Lösung. Aber ich hüpfte nach etwas, wo ich keinen Code für Json.Net schreiben musste, sondern nur meinen Serialiser. Ich möchte wirklich keinen Code für ein anderes Paket beibehalten. –

+0

@RichardSchneider Json.NET verwendet 'Environment.NewLine' zum Formatieren, es gibt keinen anderen Weg. Sie können versuchen, diese Anpassung im Fehlerverfolgungssystem vorzuschlagen. – Athari

+0

Ich habe das gerade gemacht. Danke noch einmal. –

1

Auf der Wire-Protokoll für fast Everthing ist, dass eine Linie mit crlf endet. Wenn Sie das Gefühl haben, dass Sie das wirklich tun müssen, ist die Nachbearbeitung die beste Methode - schreiben Sie sie in eine Zeichenkette und ändern Sie die Zeichenkette, bevor Sie sie zurückgeben.

Beachten Sie, dass dies eine Menge zusätzliche Verarbeitung für das ist, was ich tatsächlich negativ sehen würde. Nicht empfohlen.

+0

Ich stimme zu HTTP basiert auf CRLF. Viele Tools, die meine Freunde verwenden, können jedoch keine CRLF generieren. Ich versuche nur, ihnen das Leben zu erleichtern. –

7

Nachdem in den Code Json.Net einzutauchen, sehe ich das Problem mit JsonTextWriter.WriteIndent ist dank Athari.

Anstelle von _writer.Write(Environment.NewLine); sollte es _writer.WriteLine(); sein.

Ich habe eine Pull-Anfrage an Github gepostet. https://github.com/JamesNK/Newtonsoft.Json/pull/271

2

Ich sehe hier mehrere Lösungen, die den Serializer konfigurieren. Aber wenn Sie schnell und schmutzig wollen, ersetzen Sie einfach die Zeichen mit dem, was Sie wollen. Schließlich ist JSON nur eine Zeichenfolge.

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

Schnell und schmutzig ist richtig. Ich suche Lösungen, um den Serialiser zu konfigurieren. Diese Lösung hat eine Leistungseinbuße für den Server, die ich nicht akzeptieren will. Aber danke anway. –

+0

@RichardSchneider Was denken Sie, dass es eine Leistungseinbuße hat? Ich würde denken, dass 'SerializeObject' viel langsamer als' string.Replace' ist. – Phil1970

0

Ich weiß, dass dies eine alte Frage ist, aber ich hatte eine harte Zeit, die akzeptierte Antwort auf Arbeit zu erhalten und richtige eingerückte Formatierung beizubehalten. Außerdem erstelle ich keine Überschreibung, damit dies funktioniert.

Hier ist, wie ich dies korrekt funktionieren kann:

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 
} 

Ich gehe davon aus, dass der Code changes in dieser Frage verwies die Einstellung von NewLine auf den StringWriter aktiviert durch den Serializer respektiert werden.

Verwandte Themen