如何使用Newtonsoft读取多个json的内容



我正在使用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。

我该如何处理这种情况?

谢谢。

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

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

如果您使用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不关心空格或换行符。

因为您正在读取的 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 字符串以将其分离为单个对象,并一次反序列化一个对象。

相关内容

  • 没有找到相关文章

最新更新