C# 拆分包含一些简单字符串和一些JSON的逗号分隔列表
这里有一个奇怪的。我得到了一个构思不周的输入字符串,它是由简单字符串或JSON blob组成的列表,用逗号分隔。e、 g:C# 拆分包含一些简单字符串和一些JSON的逗号分隔列表,c#,json,split,deserialization,C#,Json,Split,Deserialization,这里有一个奇怪的。我得到了一个构思不周的输入字符串,它是由简单字符串或JSON blob组成的列表,用逗号分隔。e、 g: string input=“{},普通文本,其他一些不带逗号的字符串,{JSON_3},,{JSON_n}” 我必须将其分为两个列表-一个JSON字符串列表和一个非JSON字符串列表 好的是,非JSON字符串不包含特殊字符(没有逗号,也没有可能被误认为JSON的大括号)。不好的是JSON blob(所有blob都以{开头,以}结尾)显然包含大量逗号 “显而易见”的解决方
string input=“{},普通文本,其他一些不带逗号的字符串,{JSON_3},,{JSON_n}”
我必须将其分为两个列表-一个JSON字符串列表和一个非JSON字符串列表
好的是,非JSON字符串不包含特殊字符(没有逗号,也没有可能被误认为JSON的大括号)。不好的是JSON blob(所有blob都以{
开头,以}
结尾)显然包含大量逗号
“显而易见”的解决方案(使用
String.Split
):
List split=input.split(',').ToList();
当然,将无法转义JSON对象({}
)本身中存在的逗号
我正在考虑一种手动方法—逐个字符遍历字符串,并且仅当
{
的计数等于}
的计数时才拆分出一个新元素。比如:
List blobs=new List();
int start=0,nestingLevel=0;
for(int i=0;i
(注意:上面肯定包含bug)
这种方法可能无法处理JSON中可能出现的大量内容。例如,如果字符{
和}
在字符串(引号)中转义,它们可能会“有益地”出现在JSON中,但如果我开始计算引号,我可能会遇到转义引号(\”
)但如果我检查转义字符,我最好确保它们本身没有被转义(\\
)-这真是一场噩梦。我不希望自己编写一个完整的JSON解析器
我还考虑过在字符串的两端添加JSON数组大括号(
[]
),让JSON序列化程序将其反序列化为JSON数组,然后一次一个地重新序列化每个数组元素:
List JsonBlobs=Newtonsoft.Json.Linq.JArray.Parse(“[”+input+“])。选择(t=>t.ToString()).ToList();
唯一的问题是,我编码的任何JSON反序列化程序都“不会”处理对象列表中的随机非JSON字符串
我的猜测是,理想的解决方案需要是上述两种解决方案的混合体。我想到了以下怪物:
List blobs=new List();
int start=0;
bool in_json_land=false;
for(int i=0;i
有更好的建议吗?您已经要求类似的构建一个简单的解析器吗?当您得到一个
[
或{
时,遍历字符串进入JSON模式,并计算您在括号嵌套中的深度。当您得到]
或]
在JSON模式下,减少计数。当计数为0时,您将返回CSV模式。regex match+替换JSON,然后拆分。@PavelAnikhouski确实如此,根据meta.stackoverflow.com,如果您的原始问题不足以满足您的需要,最好提出一个新问题,而不是编辑它或请求你的建议是我问题的一部分,包括其中的缺陷。