使用多个JSON消息读取文本文件

时间:2015-06-26 08:02:34

标签: c# .net json

我有一个包含多个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;
}

5 个答案:

答案 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;}
    }

Try it online

输出:

  

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