C# 为什么JSON.NET要在一行上序列化所有内容?
我只想让JSON.net序列化程序写出JSON对象(到文件),每行一个对象,但它只是将所有内容追加到同一顶行。所有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();
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的最简单的方法吗?