如何用Newtonsoft阅读多个json的内容?

时间:2018-01-26 20:28:10

标签: c# json json.net

我正在使用Newtonsoft.Json来读取具有此结构的json文件的内容:

{"Timestamp":"2018-01-26T21:11:07.2629540+01:00","Level":"Error","MessageTemplate":"Foo"}
{"Timestamp":"2018-01-26T21:21:18.8747758+01:00","Level":"Error","MessageTemplate":"Foo1"}

正如您所看到的example.json文件中有两个json对象。我试图通过以下方式阅读:

首先我创建了类模型:

 public class RootObject
 {
    public DateTime Timestamp { get; set; }
    public string Level { get; set; }
    public string MessageTemplate { get; set; }
 }

然后我将文件的内容保存在字符串中:string content = File.ReadAllText(@"example.json");

现在我在下一行收到错误:

var json = JsonConvert.DeserializeObject<RootObject>(content);

特别是:

  

'完成阅读JSON内容后遇到的其他文字:{。路径'',第2行,第0位。'

我该如何处理这种情况?

感谢。

3 个答案:

答案 0 :(得分:3)

您可以单独读取每一行,因为否则整个文件不是有效的JSON对象。

using System.IO;

List<RootObject> objects = File.ReadAllLines("example.json")
    .Select(line => JsonConvert.DeserializeObject<RootObject>(line))
    .ToList();

答案 1 :(得分:1)

因为您正在阅读的JSON不是有效的JSON对象。你可以把它变成一个数组:

[{"Timestamp":"2018-01-26T21:11:07.2629540+01:00","Level":"Error","MessageTemplate":"Foo"},
{"Timestamp":"2018-01-26T21:21:18.8747758+01:00","Level":"Error","MessageTemplate":"Foo1"}]

然后,您可以将其反序列化为该对象的集合:

var json = JsonConvert.DeserializeObject<IEnumerable<RootObject>>(content);

否则,你必须解析你的JSON字符串,将它分成单个对象,并一次反序列化一个。

答案 2 :(得分:0)

如果您使用JsonSerializerJsonTextReader而不是JsonConvert,这是可能的。
诀窍是启用JsonTextReader.SupportMultipleContent

var objects = new List<RootObject>();

var serializer = new JsonSerializer();

using (var stringReader = new StringReader(content))
using (var jsonReader = new JsonTextReader(stringReader))
{
    jsonReader.SupportMultipleContent = true;

    while (jsonReader.Read())
    {
        var json = serializer.Deserialize<RootObject>(jsonReader);

        objects.Add(json);
    }
}

这比File.ReadAllLines更强大,因为JsonTextReader不在乎空格或换行符。