我正在使用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();
如果您使用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
不关心空格或换行符。
因为您正在读取的 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 字符串以将其分离为单个对象,并一次反序列化一个对象。