Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.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
System.Text.Json解析字符串内部存在的文档_Json_Parsing_System.text.json - Fatal编程技术网

System.Text.Json解析字符串内部存在的文档

System.Text.Json解析字符串内部存在的文档,json,parsing,system.text.json,Json,Parsing,System.text.json,我收到的字符串内容以JSON值开头(可以是简单的,也可以是复杂的),之后还有一些额外的内容。我希望能够解析JSON文档 我无法控制字符串,因此我无法在JSON内容后放置任何类型的分隔符,以使我能够隔离它 示例: "true and some more" - yields <true> "false this is different" - yields <false> "5.6/7" - yields <5

我收到的字符串内容以JSON值开头(可以是简单的,也可以是复杂的),之后还有一些额外的内容。我希望能够解析JSON文档

我无法控制字符串,因此我无法在JSON内容后放置任何类型的分隔符,以使我能够隔离它

示例:

"true and some more" - yields <true>
"false this is different" - yields <false>
"5.6/7" - yields <5.6>
"\"a string\""; then this" - yields <"a string">
"[null, true]; and some more" - yields <[null, true]>
"{\"key\": \"value\"}, then the end" - yields <{"key": "value"}>
JsonDocumentOptions
中没有允许拖尾内容的选项


作为奖励,如果你能给出一个使用
ReadOnlySpan
的解决方案,那将是一个整体。

自定义阅读器的建议答案对我不起作用,因为基本阅读器中存在问题:它只是不喜欢某些尾随字符

因为我仍然想依靠
JsonDocument.Parse()
来为我提取元素,所以我真的只需要找到元素停止的位置,将该位作为一个单独的片段断开,并将其提交给Parse方法。以下是我的想法:

publicstaticbooltryparsejsonelement(这个ReadOnlySpan,refinti,out jsoneelement元素)
{
尝试
{
int end=i;
char-endChar;
开关(span[i])
{
案例“f”:
末端+=5;
打破
案例“t”:
案例“n”:
末端+=4;
打破
案例“.”:案例“-”:案例“0”:
案例“1”:案例“2”:案例“3”:
案例“4”:案例“5”:案例“6”:
案例“7”:案例“8”:案例“9”:
end=i;
var allowDash=false;
while(end=跨度长度)中断;
}
end++;
}
end++;
打破
案例“{”:
案例“[”:
结束=i+1;
endChar=span[i]='{'?'}':']';
var inString=false;
而(端部<跨度长度)
{
var=false;
如果(span[end]='\\')
{
逃逸=真;
end++;
如果(结束>=跨度长度)中断;
}
如果(!转义(&span[end]=='”)
{
inString=!inString;
}
如果(!inString&&span[end]==endChar)中断,则为else;
end++;
}
end++;
打破
违约:
元素=默认值;
返回false;
}
var块=跨度[i..end];
如果(块[0]='\''和块[^1]='\'')
block=$“\”{block[1..^1].ToString()}\\”.AsSpan();
element=JsonDocument.Parse(block.ToString()).RootElement;
i=结束;
返回true;
}
抓住
{
元素=默认值;
返回false;
}
}

它不太关心中间的内容(除了字符串、对象和数组),以知道它是否在字符串的中间(在哪里可以找到结尾字符),并检查<代码> \/C> >分隔字符。它对我的目的来说是足够好的。


它引用一个
ReadOnlySpan
和一个整数。
i
需要是预期JSON值的开始,如果找到有效值,它将前进到后面的下一个字符。它还遵循标准的
Try*
模式,返回一个
bool
,并为值提供一个输出参数。

Yo你可以通过
CheckAdditionalContent
设置来实现这一点,请参阅。但是没有内置任何功能。也许
Utf8JsonStreamReader
from-to可以做你需要的事情,可能有适当的调整…嗯,
Utf8JsonStreamReader
from-to实际上可以按原样工作!请参阅。我真的没想到会这样做逻辑上。标记为重复,或添加为答案?您不能使用
System.Text.Json
ReadOnlySpan
反序列化,但是,您只能从字节跨度、序列或流反序列化。这是因为它被设计为直接从Utf8字节序列反序列化,而不是从字符序列反序列化。如.Just deserializ中所示对于一个
JsonElement
jsonStreamReader.Deserialize()
,我找到了测试用例工作的原因:它们都使用有效的JSON字符(
/
对注释有效)。如果添加的测试用例包含对JSON无效的字符,例如,
+
g
,则测试失败。(不确定为什么
有效。)……可能。
也会破坏它。
')' is invalid after a single JSON value. Expected end of data.