Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.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 blob列表(忽略JSON blob中的逗号)_C#_Json_Regex_Split - Fatal编程技术网

C# 拆分由逗号分隔的JSON blob列表(忽略JSON blob中的逗号)

C# 拆分由逗号分隔的JSON blob列表(忽略JSON blob中的逗号),c#,json,regex,split,C#,Json,Regex,Split,这里有一个奇怪的。我得到了一个构思不周的输入字符串,它是一个JSON blob列表,用逗号分隔。e、 g: string input=“{},{JSON_2},{JSON_3},…,{JSON_n}” 我必须将其转换为JSON字符串的实际列表(list) 对于上下文,不卫生的JSON“输入”列表直接从磁盘上的.txt文件读取,该文件由其他软件生成。我正在编写一个“适配器”,以允许另一个软件使用这些数据,该软件知道如何解释列表中包含的各个JSON对象。理想情况下,原始软件可以为每个JSON对象输

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

string input=“{},{JSON_2},{JSON_3},…,{JSON_n}”
我必须将其转换为JSON字符串的实际列表(
list

对于上下文,不卫生的JSON“输入”列表直接从磁盘上的.txt文件读取,该文件由其他软件生成。我正在编写一个“适配器”,以允许另一个软件使用这些数据,该软件知道如何解释列表中包含的各个JSON对象。理想情况下,原始软件可以为每个JSON对象输出一个文件


“显而易见”的解决方案(使用
String.Split
):

List split=input.split(',').ToList();
当然,将无法转义JSON对象(
{}
)本身中存在的逗号


我正在考虑一种手动方法—逐个字符遍历字符串,并且仅当
{
的计数等于
}
的计数时才拆分出一个新元素。比如:

List JsonBlobs=new List();
int start=0,nestingLevel=0;
for(int i=0;i
(上面可能包含bug)


我还考虑过在字符串的两端添加JSON数组大括号(
[]
),让JSON序列化程序将其反序列化为JSON数组,然后一次一个地重新序列化每个数组元素:

List JsonBlobs=Newtonsoft.Json.Linq.JArray.Parse(“[”+input+“])
.Select(token=>token.ToString()).ToList();
但这似乎过于昂贵,可能会导致新序列化的JSON表示与原始字符串内容不完全相同


还有更好的建议吗


如果可能的话,我更喜欢使用一些易于理解的内置库和/或LINQ。Regex将是最后的选择,尽管漂亮的Regex解决方案也很有趣。

尝试使用自己的规则解析这一点是令人担忧的。您注意到了JSON属性以逗号分隔的问题,但也要记住JSON值可以包括字符串,其中可能包含大括号和逗号,甚至可以包含与JSON结构无关的引号字符

{"John's comment": "I was all like, \"no way!\" :-}"}
要正确地执行此操作,您需要编写一个能够处理所有JSON规则的解析器。你很可能会犯错误,也不太可能从你所付出的努力中获得多少价值

我个人建议在字符串的两侧添加括号,并将整个字符串反序列化为JSON数组


我还建议质疑将结果转换为字符串列表的要求:该要求是否基于某人的假设,即生成字符串列表比生成
JObject
s列表或某个特定序列化类型的列表更简单?

您可以尝试拆分:

(?<=}),(?={)

对于以下对象数组,它也会失败:

{"key1":[{"key2":"value2"},{"key3":"value3"}]}

:-/

关于字符串要求,JSON是对象图的文本表示形式,因此,例如,如果输入时大括号中有空格,而输出中没有空格,则这并不是实质性的区别。如果这对你很重要,那就是质疑这个要求的原因。很好。至于需求的性质,我将把它编辑到上下文的帖子中。@Alain:上下文并没有给我任何理由相信您实际上需要生成给定的确切JSON字符串。我首先用括号括起来,然后用JSON序列化它。我认为JSON.NET能够进行一些流式反序列化,因此您可能一次只接收一个对象的输入,然后将结果输出到一个单独的文件中。只有当您发现这种方法存在严重的性能问题时,才可以考虑编写一个更优化的版本。同意,尽管保留原始字符串不动“很好”,但它对数据的最终使用应该没有任何意义的影响。我担心(根据过去的经验)Newtonsoft会反序列化UTC日期时间,并在后面重新序列化为特定于区域设置的日期时间,这可能会产生微妙的影响(比如UTC日期时间的值为DateTime.Min,区域设置为-3小时)JSON没有任何时间类型,因此,如果您仅使用
Newtonsoft.JSON.LINQ
命名空间(
JArray.Parse
这样做)中定义的LINQ到JSON类型,则不会发生转换,因为它们只会被解析为字符串。因此,如果您将它们反序列化为数组,然后将它们序列化为字符串列表,即使字符串与输入部分不完全匹配,对象在结构上和值上都是相同的,这有什么害处?这可能不是最有效的方法,但如果它起作用,现在就这样做,以后再想出更好的方法。从(FM-)中选择“复制你喜欢的”,JSON.NET现在通过设置
JsonReader.SupportMultipleContent=true
,直接支持逗号分隔的JSON反序列化;看见如果确实需要将每个blob作为字符串,可以将每个blob反序列化为
JRaw
,请参阅。
{"key1":[{"key2":"value2"},{"key3":"value3"}]}