C# 为什么JSON.NET要在一行上序列化所有内容?

C# 为什么JSON.NET要在一行上序列化所有内容?,c#,json,json.net,C#,Json,Json.net,我只想让JSON.net序列化程序写出JSON对象(到文件),每行一个对象,但它只是将所有内容追加到同一顶行。所有JSON.net示例似乎都暗示我想要的是默认行为,但我不认为它是这样工作的。以下是代码: static void EtwToJsonHelper(TraceEvent data, JsonSerializer s, JsonTextWriter jw) { var names = data.PayloadNames; jw.WriteStartObject();

我只想让JSON.net序列化程序写出JSON对象(到文件),每行一个对象,但它只是将所有内容追加到同一顶行。所有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();
}
输出如下所示: {object}{obj2}…{objN}都在一行上

但我想:

{obj1}

{obj2}


如何做到这一点?

为了清晰起见,提供的示例是缩进的,但默认行为是写入生成的JSON字符串,而不使用任何不必要的空格。您可以像这样覆盖此行为:

jw.Formatting = Formatting.Indented;
jw.WriteStartObject();
...
...
jw.WriteEndObject();
jw.WriteRaw("\n");
进一步阅读


为了确保每个条目都附加到一个新行,您只需在编写JSON对象后编写一个新行字符,如下所示:

jw.Formatting = Formatting.Indented;
jw.WriteStartObject();
...
...
jw.WriteEndObject();
jw.WriteRaw("\n");

或者通过调用底层的
TextWriter
,尽管这需要在这个方法之外完成。

解决了这个问题,但不确定是否有更干净的方法。我加了一个

jw.WriteWhitespace(Environment.NewLine);
最后。现在一切看起来都很好:

{“时间戳”:“2014-03-10T15:04:27.0128185”,…}
{“时间戳”:“2014-03-10T15:04:27.0128185”,…}

应该提到,我不想要缩进的JSON,因为这会在对象中放入新行,而它是KVP的;我只希望每个对象有一条新线。“蜂巢喜欢这样的JSON。”我明白了。查看我的更新答案,了解一些如何做的选项。哈哈!谢谢你,老兄,我得出了同样的结果,并公布了我的答案。“看来你比我先到了。”杰金:没问题。这类问题通常有多种解决方案+1作为备选方案发布您的答案。关心JSON的特定格式似乎很愚蠢。。在需要这种特定格式的地方,有一些“JSON漂亮的格式化程序/打印机”可以应用于特定的(人类)消费。这是针对Hive的,不是针对人类的。Hive自然希望每行有一个记录/对象。这让我很难过:(就像“自然”希望XML元素之间有空白一样。但是,我想你需要你所需要的。这真的是将TraceeEvent序列化为JSON的最简单的方法吗?