在括号之间查找字符串

时间:2016-08-01 11:19:42

标签: c#

我的字符串看起来像这样:

{
    "acl_gent": {
        "cluster": [],
        "indices": [{
            "names": ["am*"],
            "privileges": ["read", "view_index_metadata"],
            "query": "{\"match\": {\"ACL\": \"acl_gent\"}}"
        }],
        "run_as": []
    },
    "acl_luik": {
        "cluster": [],
        "indices": [{
            "names": ["am*"],
            "privileges": ["read", "view_index_metadata"],
            "query": "{\"match\": {\"ACL\": \"acl_luik\"}}"
        }],
        "run_as": []
    }
}

我希望将其拆分为2个字符串,其中1个包含 acl_gent ,另一个包含 acl_luik

上面的字符串可以包含2个以上的acl(我不要知道名字是什么)

所以我开始删除第一个和最后一个bracketes:

input = input.Substring(1, input.Length - 2);

然后我无法弄清楚如何找到合适的右括号来提取数据。

这是我最接近的

private int closer(string input) {
    var i = input.IndexOf('}');
    Console.WriteLine(string.Format("[DEBUG] Checking: {0}", input.Substring(0, i).Contains('{')));
    if (input.Substring(0, i).Contains('{')) {
        return i + closer(input.Substring(i)) + 2;
    }

    return i;
}

3 个答案:

答案 0 :(得分:1)

你所拥有的是一个JSON字符串,一个来自Web服务的常见响应,并且有很多库可以解析JSON,最常见的是JSON.NET。有了这个,你可以做类似

的事情

JObject myJsonObject = JObject.Parse(myResponse)

并按键名检索字符串,例如

JObject aclString = myJsonObject["acl_luik"];

如果您想了解更多详细信息,可以使用大量资源在线解析JSON字符串。

答案 1 :(得分:1)

这里有2个选项:

1)解析为JSON并获得前2个对象,这是更好的对象。

2)使用Stack作为令牌字符串解析得到你想要的东西,如下所示:   - 删除第一个和最后一个{}   - 使用堆栈,添加所有{找到,一旦找到}删除堆栈中的第一个{。   - 一旦堆栈为空,那么你在那里得到一个完整的对象,在工作时保存indeces,并且应该很容易用开始和结束子串。

答案 2 :(得分:1)

我最近遇到了同样的问题。我的解决方案是将字符串反序列化为json对象(在我的例子中是使用Json.net的JObject),然后访问各个成员并将它们序列化为单独的字符串。

using Newtonsoft.Json.Linq;

public void MakeStrings(string json)
{
    var jobject = JsonConvert.DeserializeObject<JObject>(json);
    string acl_gent = JsonConvert.SerializeObject(jobject["acl_gent"]);
    string acl_luik = JsonConvert.SerializeObject(jobject["acl_luik"]);
}