首页 > 解决方案 > 基于语法的自定义字符串分隔

问题描述

我有一个这样的字符串:

[
{
    "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#

解决方案


正如评论所暗示的那样,您似乎正在尝试在 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 这样的库会更轻松。


推荐阅读