2016-07-18 62 views
2

我正在C#中工作,现在我正在使用JSON.Net来解析JSON字符串以及C#对象。我的问题的部分原因是,我得到一些字符串这样的:用匹配的花括号分割字符串的最佳方法

{"name": "John"}{"name": "Joe"} 

当我试着使用JsonConvert.DeserializeObject<>反序列化,它抛出一个异常。

我想知道将这个更大的字符串拆分成更小的json字符串的最佳方式是什么。

我正在考虑检查字符串并匹配“0级”的大括号。这似乎是一个好主意吗?或者有更好的方法来做到这一点?

+0

你从哪里得到这个JSON? –

+0

他们是我从一项正在进行的练习中获得的一些测试案例。 – Benjamin

+3

这不是有效的Json,但它可以有小的变化[{“name”:“John”},{“name”:“Joe”}] –

回答

7

您可以使用JsonTextReaderSupportMultipleContent标志设置为true来阅读这个非标准的JSON。假设你有一个类Person,看起来像这样:

class Person 
{ 
    public string Name { get; set; } 
} 

你可以反序列化这样的JSON对象:

string json = @"{""name"": ""John""}{""name"": ""Joe""}"; 

using (StringReader sr = new StringReader(json)) 
using (JsonTextReader reader = new JsonTextReader(sr)) 
{ 
    reader.SupportMultipleContent = true; 

    var serializer = new JsonSerializer(); 
    while (reader.Read()) 
    { 
     if (reader.TokenType == JsonToken.StartObject) 
     { 
      Person p = serializer.Deserialize<Person>(reader); 
      Console.WriteLine(p.Name); 
     } 
    } 
} 

小提琴:https://dotnetfiddle.net/1lTU2v

+0

这效果最好。谢谢! – Benjamin

+0

很高兴我能帮到你。 –

2

我找到了最好的方法是将字符串转换为一个阵列结构:

string json = "{\"name\": \"John\"}{\"name\": \"Joe\"}"; 

json = json.Insert(json.Length, "]").Insert(0, "[").Replace("}{", "},{"); 

// json now is  [{"name": "John"},{"name": "Joe"}] 
List<Person> result = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Person>>(json); 

假设你的类名是Person

public class Person 
{ 
    public string Name { set; get; } 
} 
+0

那么,我提供的样本是用于有一级花括号。如果有两个或三个级别,这会工作吗? – Benjamin

+0

@Benjamin发表最复杂的例子,你可以得到,我会很乐意给它一个尝试:) – user3185569

相关问题