C# 使用Newtonsoft.json检测json对象的结尾

C# 使用Newtonsoft.json检测json对象的结尾,c#,json,json.net,C#,Json,Json.net,我有一个以JSON对象开始的字符串,但在该字符串结束后继续(类似于{“a”:“fdfsd”,“b”:5}ghresd)。后面的文本可以包含任何字符,JSON可以是JSON允许的任何内容 我想反序列化JSON对象并知道它的结尾,因为我想在之后处理字符串的其余部分,我该如何做,最好使用Newtonsoft.JSON?您可以使用该属性,例如: var json = "{\"a\":\"fdfsd\",\"b\":5}ghresd"; var reader = new JsonTextReader(n

我有一个以JSON对象开始的字符串,但在该字符串结束后继续(类似于
{“a”:“fdfsd”,“b”:5}ghresd
)。后面的文本可以包含任何字符,JSON可以是JSON允许的任何内容

我想反序列化JSON对象并知道它的结尾,因为我想在之后处理字符串的其余部分,我该如何做,最好使用
Newtonsoft.JSON

您可以使用该属性,例如:

var json = "{\"a\":\"fdfsd\",\"b\":5}ghresd";

var reader = new JsonTextReader(new StringReader(json));
reader.SupportMultipleContent = true;

//Read the first JSON fragment
reader.Read();

var serializer = new JsonSerializer();
var result = serializer.Deserialize(reader);

//Or if you have a class to deserialise into:
//var result = serializer.Deserialize<YourClassHere>(reader);

//Line position is where the reader got up to in the JSON string
var extraData = json.Substring(reader.LinePosition);
var json=“{\'a\':\'fdfsd\',\'b\':5}ghresd”;
var reader=newjsontextreader(newstringreader(json));
reader.SupportMultipleContent=true;
//读取第一个JSON片段
reader.Read();
var serializer=new JsonSerializer();
var result=序列化程序。反序列化(读取器);
//或者,如果您有一个类要反序列化到:
//var result=序列化程序。反序列化(读取器);
//行位置是读取器在JSON字符串中到达的位置
var extraData=json.Substring(reader.LinePosition);

如果您的
json
有多行代码,则此代码可能无法正常工作:

var extraData=json.Substring(reader.LinePosition);

您可能需要考虑添加额外的检查:

if(reader.LineNumber!=1)
抛出新的NotSupportedException(“不支持多行JSON对象”);
或者您可以使用
反射
从私有字段中获取该值:

var charPosition=(int)reader.GetType().GetField(“_charPos”,BindingFlags.Instance | BindingFlags.NonPublic).GetValue(reader);

您可能会发现我前面相关问题的答案很有帮助,尽管在这种情况下我使用的是JavaScript:字符串是否在json对象后面包含}?希望不会。然后可以使用Parse和yourString.SubString(0,yourString.LastIndexOf('}')作为参数。从第一个
{
}
的最后一个索引获取所有内容如何。。。这可能是您的json以及其他您可以处理的内容。您还可以使用
JToken.Parse
验证它是否是有效的json。您可以丢弃结尾后的字符,如所示,但是
JsonTextReader
缓冲其内容,而且没有任何机制来报告当前角色的位置。@Tobias Brohl在这个上下文中OP的意思是“原始海报”。检查这个,但看起来很棒