我有一个包含多个JSON消息的文本文件。除了新行之外没有分隔符。我有一个方法,它将采用JSON字符串并将其反序列化为某种对象类型。
如何读取文本文件并遍历每个Json字符串以便反序列化?
以下是反序列化的方法:
public static T JsonDeserialize<T>(string jsonString)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
T obj = (T)ser.ReadObject(ms);
return obj;
}
答案 0 :(得分:2)
您可以使用 jsonReader.SupportMultipleContent 属性 消息换行符,制表符或空格之间的分离并不重要。
SupportMultipleContent设置值true / false(默认值为false),指示是否可以从连续流中读取多条JSON内容而不会出现错误。
示例:
public static void Main()
{
string json = @"
{
'Name': 'foo',
'Id': 123
}{
'Name': 'bar',
'Id': 456
}
//more new line
{
'Name': 'jar',
'Id': 789
}
";
var persons = DeserializeObjects<Person>(json).ToList();
Console.WriteLine(persons.Count());
foreach ( var person in persons)
{
Console.WriteLine("id: {0}, Name: {1}",person.Id, person.Name);
}
}
static IEnumerable<T> DeserializeObjects<T>(string input)
{
JsonSerializer serializer = new JsonSerializer();
using (var strreader = new StringReader(input))
using (var jsonreader = new JsonTextReader(strreader))
{
//you should use this line
jsonreader.SupportMultipleContent = true;
while (jsonreader.Read())
{
yield return serializer.Deserialize<T>(jsonreader);
}
}
}
class Person
{
public int Id {get;set;}
public string Name {get;set;}
}
输出:
3
id:123,姓名:foo
id:456,姓名:bar
id:789,姓名:jar
答案 1 :(得分:1)
如果您的Json字符串被新行分隔,您可以遍历所有行并使用以下代码解析它们:
List<YourClass> objects = new List<YourClass>();
String[] lines = File.ReadAllLines("path\to\file.txt");
foreach (string line in lines)
{
try
{
var obj = JsonDeserialize<YourClass>(line);
objects.Add(obj);
}
catch (Exception) { }
}
如果这对您没有帮助,请发布示例文件。
答案 2 :(得分:1)
我唯一能想到的就是遍历每个字符并计算括号。当括号计数为零时,它会将组合字符串添加到列表中。最后,您将获得单个JSON字符串的列表。
public List<string> GetJsonItems()
{
int BracketCount = 0;
string ExampleJSON = new StreamReader(@"c:\Json.txt").ReadToEnd();
List<string> JsonItems = new List<string>();
StringBuilder Json = new StringBuilder();
foreach (char c in ExampleJSON)
{
if (c == '{')
++BracketCount;
else if (c == '}')
--BracketCount;
Json.Append(c);
if (BracketCount == 0 && c != ' ')
{
JsonItems.Add(Json.ToString());
Json = new StringBuilder();
}
}
return JsonItems;
}
编辑:更改代码以使用StringBuilder,现在更快。几乎立即解析出2MB的JSON文件。
答案 3 :(得分:0)
我建议使用StreamReader
课程。这有一个方法ReadLine()
,它会一次返回一条json
条消息。您可以在阅读文件时调用JsonDeserialize
函数,也可以将所有邮件放入列表中并稍后对其进行反序列化。
List<MyClass> deserializedObjects = new List<MyClass>();
using(var reader = new StreamReader(pathToFile)){
while(!reader.EndOfStream){
deserializedObjects.Add(JsonDeserialize<MyClass>(reader.ReadLine()));
}
}
答案 4 :(得分:0)
您还可以拆分文本文件并遍历每个JSON部分。
这样的事情:
void ReadJsonWithLinebreaks(string jsonFilePath)
{
string jsonFileContent = File.ReadAllText(jsonFilePath);
string[] jsonContentSplitted = jsonFileContent.Split(Environment.NewLine.ToCharArray());
// ... iterate through array that contains your JSON content
}
编辑:
如果您的JSON文件带有换行符,请使用File.ReadAllLines()
代替File.ReadAllText
。