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

时间:2019-04-03 19:54:11

标签: c# json json.net

我有一个以json对象开头的字符串,但在字符串的结尾之后一直存在(类似于{"a":"fdfsd","b":5}ghresd)。之后的文本可以包含任何字符,而json可以是json允许的任何内容。

我想反序列化json对象并知道它在哪里结束,因为我想在以后处理其余的字符串,我该怎么做,最好使用Newtonsoft.Json?

2 个答案:

答案 0 :(得分:2)

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

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);

答案 1 :(得分:2)

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

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

您可能需要考虑添加其他支票:

if(reader.LineNumber != 1)
  throw new NotSupportedException("Multiline JSON objects are not supported.");

或者您可以使用Reflection从私有字段中获取该值:

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

documentation