I have a text file which contains multiple JSON messages. There is no separator except new line. I have a method which will take JSON string and deserialize it to some object type.
How can I read text file and iterate through each Json string so that it can be deserialized?
Below is the method for deserialize:
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;
}
You can use jsonReader.SupportMultipleContent Property.
It doesn't matter the separation between the messages newline(s), tab or space(s).
SupportMultipleContent sets a value true/false (default is false) indicating whether multiple pieces of JSON content can be read from a continuous stream without error.
Example:
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
output:
3
id: 123, Name: foo
id: 456, Name: bar
id: 789, Name: jar
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With