C#中的字符串分割逻辑

3
我有一个REST服务,返回一个JSON字符串。这个字符串是几个单词的聚合。在组合这些字符串时,我使用“/”作为分隔符,以便稍后按分隔符拆分它。
例如:我得到的JSON字符串是- AAA/BBB/CCC(我从数据库中读取这些值)。
在UI中,我从分隔符“/”处拆分此字符串,以便得出业务逻辑。
问题是我引入的分隔符“/”用户也可以输入。例如,如果用户在其中一个字符串中也输入了“/”,那么我的JSON将如下所示:
例如:AAA/BBB/CC/C(用户在两个C之后输入了/)
然后我的字符串分割逻辑是错误的,因为我也使用相同的值来拆分字符串。
应该如何处理这种问题?我使用.NET C#。
理想情况下,我希望有一种方法来组合我的字符串并基于用户无法输入的内容拆分字符串。

2
为什么不能使用不同的分隔符或限制用户输入您的分隔符? - Peru
1
首先,为什么要将组合字符串保存到数据库中?了解数据库规范化的知识会很有用。 - Renatas M.
2
你不能从JSON返回一个对象吗?比如一个数组['AAA', 'BBB', 'CCC']?这应该很容易从C#生成,并且从Javascript读取/生成也同样容易。 - Vlad Ciobanu
JSON支持数组或集合的概念。 - Jodrell
如果你真的需要这样做,那么分隔符就要非常特殊,例如 -]\[-,然后在应用程序中,在拆分之前,您需要使用字符串的 Replace 方法将您的 5 个字符分隔符替换为一个,例如 yourValue.Replace("-]\[-","$"); 然后执行 Split('$') 或任何其他用户可能使用的较少可能的字符。 - Harry89pl
显示剩余7条评论
6个回答

4

一种选择是不将集合存储为标量值。您可以在数据库中使用一对多关系来建模,或者例如将集合序列化为XML并将其存储在单个列中。


1
请勿使用字符串来表示数组。您应该返回一个JSON ['第一', '第二', '第三', '等等']。您可以使用任何JSON库从C#生成它(如果您正在使用MVC3,则可以轻松地return Json(...)一个数组)。
就JavaScript而言,您可以轻松使用数组。此外,将其发送回来也应该很容易。

1

不要重复造轮子,也不要编写自己的序列化代码。为什么不使用标准的JSON库来进行序列化呢?

JSON已经支持数组或集合的概念,并且被设计用于转义其自身的分隔符。没有必要将自己的专有格式添加到一些标准JSON中。

这个问题已经解决了JSON序列化器选择的问题。


只需将字符串存储在您的对象上,例如一些IEnumerable<string>。它们很可能已经以这种方式从您的数据模型中出现了。


0
在“/”之前添加一个“/”。额外的“/”将表明您应该将其处理为字符,而不是分隔符标志。您可以使用regex进行拆分。

用户仍然可以在他们的字符串中输入“'//'”。我认为这并不能解决问题。 - Vlad Ciobanu
并且这个会被切成“////”,这样你就知道它们都不是分隔符。 - elyashiv

0

您可以做类似以下这样的事情,使用字符串组合

string S='AAA','BBB','CCC'

然后在代码中,您可以按照以下方式编写:

string[] ary=S.Replace("|","Pipe;").Replace("','","|").Split('|') ary[0] = ary[0].Replace("Pipe;","|")


2
如果用户输入了 ',' 或 "Pipe;" 会发生什么? - elyashiv
使用一个不能从键盘输入的分隔符,比如£。 - user1562231
2
在英国和爱尔兰的几乎每个键盘上都有的一个按键,在美国国际键盘上也有,许多其他键盘上也有,并且大多数键盘都有一些组合方式来输入它。即使它不在键盘上,如果用户必须复制粘贴才能输入英镑符号,并且他们想要输入英镑符号,他们也会这样做。 - Jon Hanna
是的,使用“$”会好得多(开玩笑)。 - Jodrell
因为用户永远不会从多行文本中复制粘贴,所以我认为\u001F是更安全的选择,但最好还是避免使用。 - Jon Hanna

0

如果您正在使用POST或PUT方法发送此字符串,则根本不要自己编码。我们已经定义了XML和JSON,虽然人们可能会无休止地争论它们的优缺点,但它们都可以使用,所以请使用其中之一。

如果您在URI中使用此字符串进行GET请求(当它自然是GET时更好的选择,当它不是时则更糟糕,容易出现错误),那么application/x-www-form-urlencoded已经为此使用定义得很好:item=AAA&item=BBB&item=CCC,其中&=不需要进行uri编码,但任何&=(以及URIs中受限制的任何其他字符)都需要按照正常方式进行编码(计算出字符的UTF-8并在每个八位字节值后添加一个%,例如=%3Dë%C3%AB等)。

如果您真的需要坚持您的基本方法,那么U+001F是一种控制字符,传统上它的目的是在最低级别上分隔字段(U+001E、U+001D和U+001C在越来越高的字段组分隔级别上使用),并且不会出现在大多数键盘上(除非有人足够书呆子和老派,设置了一个键盘以键入它们,期望它们分隔字段)。虽然我认为美国的计算机仍然被总统约翰逊命令支持这些字符,但我不建议采用这种1960年代的方法来解决2012年的问题,如果可能的话,请避免使用它!
还有一点,请以Ada Lovelace之爱的名义,如果可能的话,请不要将编码后的字符串存储在数据库中(除了可能只是为了记录发送的日志以进行诊断的日志表)。请将单独的字段存储在数据库中,作为单独的字段。规范化是一种60年代的方法,在2012年仍然很重要。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接