我的字符串看起来像这样:
{
"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;
}
答案 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"]);
}