【问题标题】:Best ways to split a string with matching curly braces用匹配的花括号分割字符串的最佳方法
【发布时间】:2016-07-18 05:19:46
【问题描述】:

我现在在 C# 中工作,我正在使用 JSON.Net 将 json 字符串解析为 C# 对象。我的部分问题是我得到了一些这样的字符串:

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

当我尝试使用 JsonConvert.DeserializeObject<> 反序列化时,它会引发异常。

我想知道将这个较大的字符串拆分为较小的 json 字符串的最佳方法是什么。

我正在考虑遍历字符串并匹配“级别 0”的花括号。这看起来是个好主意吗?或者有更好的方法吗?

【问题讨论】:

  • 你从哪里得到这个 json?
  • 它们是我正在做的一个练习中给我的一些测试用例。
  • 它不是有效的 Json,但可以进行一些小的更改 [{"name": "John"},{"name": "Joe"}]

标签: c# json json.net


【解决方案1】:

您可以使用 JsonTextReader 并将 SupportMultipleContent 标志设置为 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

【讨论】:

    【解决方案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; }
    }
    

    【讨论】:

    • 嗯,我提供的示例是针对有一级花括号的情况。如果有两个或三个级别,这会起作用吗?
    • @Benjamin 发布了你能得到的最复杂的例子,我很乐意试一试 :)
    猜你喜欢
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多