2014-03-13 55 views
6

我只想讓JSON.net序列化程序寫出JSON對象(到文件),每行一個對象,但它只是將所有內容都附加在同一行上。所有的JSON.net示例似乎都暗示我想要的是默認行爲,但我沒有看到它以這種方式工作。這裏是代碼:爲什麼JSON.NET將所有內容序列化在一行上?

static void EtwToJsonHelper(TraceEvent data, JsonSerializer s, JsonTextWriter jw) 
{ 
    var names = data.PayloadNames; 

    jw.WriteStartObject(); 
    jw.WritePropertyName("TimeStamp"); 
    jw.WriteValue(data.TimeStamp); 
    ... 
    jw.WriteEndObject(); 
} 

輸出看起來是這樣的: {對象} {OBJ2} {...} objN所有在一行。

但我想:

{} OBJ1

{} obj2的

...

我該怎麼辦呢?

+0

關心JSON的特定格式似乎很愚蠢。在需要這種特定格式的情況下,可以使用「JSON格式化程序/打印機」 ) 消費。 – user2864740

+0

這是蜂巢,而不是人類。 Hive自然期望每行單個記錄/對象。 – jeking

+1

這「自然地」讓我傷心:(這就像是「自然地」期待期望XML元素之間的空白空間,但是,我想你需要你需要的東西.. – user2864740

回答

11

爲了清楚起見,提供的示例是縮進的,但默認行爲是編寫生成的JSON字符串而不會產生任何不必要的空白。您可以覆蓋此行爲是這樣的:

jw.Formatting = Formatting.Indented; 
jw.WriteStartObject(); 
... 

進一步閱讀


爲了確保每個條目被附加到一個新的生產線,你可以簡單地在寫完JSON對象後寫一個新的行字符,如下所示:

... 
jw.WriteEndObject(); 
jw.WriteRaw("\n"); 

或通過調用底層TextWriter上的WriteLine,儘管這需要在此方法之外完成。

+0

應該提到我不想縮進JSON,因爲在對象中放置了新的線條,並且它是KVP的;我只是希望每個對象都有一個新的線條。Hive喜歡這樣的JSON。 – jeking

+0

@jeking我明白了,看看我的更新後的答案,瞭解如何做到這一點的一些選項。 –

+0

哈! ,我得到了同樣的結果,併發布了我的答案,但看起來像你打敗了我, – jeking

1

想通了,雖然不知道是否有更清晰的方法。我添加了一個

jw.WriteWhitespace(Environment.NewLine); 

最後。現在一切都看起來很不錯:

{ 「時間戳」: 「2014-03-10T15:04:27.0128185」,...}
{ 「時間戳」: 「2014-03-10T15:04:27.0128185」 ,. ..}
...

相關問題