Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 拆分包含一些简单字符串和一些JSON的逗号分隔列表_C#_Json_Split_Deserialization - Fatal编程技术网

C# 拆分包含一些简单字符串和一些JSON的逗号分隔列表

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都以{开头,以}结尾)显然包含大量逗号 “显而易见”的解决方

这里有一个奇怪的。我得到了一个构思不周的输入字符串,它是由简单字符串或JSON blob组成的列表,用逗号分隔。e、 g:

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,如果您的原始问题不足以满足您的需要,最好提出一个新问题,而不是编辑它或请求你的建议是我问题的一部分,包括其中的缺陷。