c# - 基于语法的自定义字符串分隔
问题描述
我有一个这样的字符串:
[
{
"info": "thing 1 by person 1",
"glow": "0xff9900",
"glowalpha": 1,
"glowsize": 2,
"glow2": "0xabcdef",
"glowalpha2": 1,
"glowsize2": .4,
"glow3": "0x1e1e1e",
"glowalpha3": .5,
"glowsize3": .1,
"paletteSwap"{
"colors":[0,-500]
"replacements":[-26368,99]
},
"paletteSwapPA"{
"colors":[0,-500]
"replacements":[-26368,99]
}
},
{
"info": "another thing by person 2",
"glow": "0xff9900",
"glowalpha": 1,
"glowsize": 2,
"paletteSwap"{
"colors":[0,99,76,832638]
"replacements":[-26368,847261,9387,92812]
},
"paletteSwapPA"{
"colors":[0,99,76,832638]
"replacements":[-26368,847261,9387,92812]
}
},
//and so on. The last "phrase" won't have a comma at the end.
]
我可以很容易地去掉开头和结尾的 [ ]——这很容易被 Substrings 处理。我如何设法将这些“短语”分成一个 ArrayList,例如
东西[0] =
{
"info": "thing 1 by person 1",
"glow": "0xff9900",
"glowalpha": 1,
"glowsize": 2,
"glow2": "0xabcdef",
"glowalpha2": 1,
"glowsize2": .4,
"glow3": "0x1e1e1e",
"glowalpha3": .5,
"glowsize3": .1,
"paletteSwap"{
"colors":[0,-500]
"replacements":[-26368,99]
},
"paletteSwapPA"{
"colors":[0,-500]
"replacements":[-26368,99]
}
}
, 事物[1] =
{
"info": "another thing by person 2",
"glow": "0xff9900",
"glowalpha": 1,
"glowsize": 2,
"paletteSwap"{
"colors":[0,99,76,832638]
"replacements":[-26368,847261,9387,92812]
},
"paletteSwapPA"{
"colors":[0,99,53315]
"replacements":[-26368,847261,67543]
}
}
等等?我根本不能使用 .split(',') ——这也会将“短语”中的内容分开,而且我不能轻易地将它们粘在一起,因为它们没有一致的行数。
我该怎么办?
解决方案
正如评论所暗示的那样,您似乎正在尝试在 C# 中解析 JSON,而 Newtonsoft 库对此非常有用。但是,如果由于某种原因您不想使用库,我相信正确的方法是使用等效的堆栈:
您可以轻松找到第一个{
,因为它将是字符串中的第一个元素。现在的问题是如何找到其关联的}
. 好吧,问题将是在与第一个花括号相关联{
的出现}
之前可能有很多。但是,请注意,当您遍历字符串时,根据 JSON 树结构的性质,您永远不会看到超过的情况。事实上,只要你看到了等量的and ,你就找到了一对大括号。所以请执行以下操作(在伪代码中):}
}
{
{
}
int counter = 0;
int openBraceIdx = position;
int closedBraceIdx;
foreach elem in your string starting from openBraceIdx:
if elem == "{":
counter++
if elem == "}":
counter--
if counter == 0:
closedBraceIdx = elemIdx;
break;
(显然检查不超过字符串的范围和什么不)
这将为您提供相关的}
职位。然后您可以再次调用上面的代码,您现在可以根据需要拼接和剪切字符串。如果您尝试解析 JSON 字符串,您应该创建一个递归函数来执行此操作,并且您需要创建一个 JSON 类对象来存储您的结果。同样,如果是这种情况,使用像 Newtonsoft 这样的库会更轻松。
推荐阅读
- angularjs - ENOENT: node_modules\jquery\dist\jquery.min.js'没有这样的文件或目录
- react-native - 在本机反应中动态地将滚动视图移动到特定位置
- ios - 在 Swift 中使用具有不同数据类型的数组
- javascript - 映射中的粗箭头条件
- mod-rewrite - URL 重写 - htacces
- reactjs - 使用 react-google-maps 挂载后向 map/clusterer 添加标记
- algorithm - 基于纬度/经度的物流路由和隔离算法
- memory - FilteredListMixin(过滤孩子)
- oracle - 从perl将数字的oracletable传递给存储过程
- powershell - 通过启动进程运行 cmd.exe 但无法将命令传递给 cmd.exe