我正在使用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位。'
我该如何处理这种情况?
感谢。
答案 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)
如果您使用JsonSerializer
和JsonTextReader
而不是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
不在乎空格或换行符。