我有不完整的JSON字符串,因此JSON无效,例如:
{
"Id": 0,
"Name": "John",
"Surname": "Smith",
"BadAnswers": ["Answer1", "Answer2"],
"CorrectAnswers": ["Answer3", "Answer4", "Answer5", "Answ
从这个JSON我需要提取完整的ID
,Name
和BadAnswers
字段。我不能使用json.net反序列化此字符串,因为JSON无效
真实案例包含更复杂的JSON与嵌套对象,列表等,但想法相同。
所以主要的问题是如何从部分完成的JSON中提取完整的字段?
更新1. 我无法手动使JSON有效,因为它可能会在随机位置被截断,而不仅仅是在示例中显示的位置。我唯一知道的是所有必需的属性都存在于截断的JSON中。但是,如果有任何方法使用json.net或任何其他库使JSON有效,那将是一个很好的解决方案。
UPDATE 2。然而,对于这个问题已经有了答案,它是一个非常低级的解决方案,并且需要大量的手动工作来处理令牌,并且不能很好地概括为不同的JSON格式
您的解决方案可能是使用JsonReader
例如,考虑更复杂的JSON,如下所示:
{
"actions": [
{
"completed": true,
"id": 0
},
{
"completed": true,
"id": 1
}
],
"someProperty": false,
"anotherProperty": true,
"requiredIdProperty": 1,
"requiredArrayProperty": [
{
"nestedIdPropery": 0,
"nestedBoolProperty": true
},
{
"nestedIdPropery": 1,
"nestedBoolProperty": false
}
],
"truncatedObject": {
"firstProperty": 990,
"secondProperty": 0,
"thirdPrope
在这种情况下,使用requiredIdProperty
提取JsonReader
没有问题,但提取requiredArrayProperty
很痛苦,因为我需要手动处理所有JSON令牌,例如JsonToken.ArrayStart
和其他。再说一遍,真实案例可能会包含更复杂的JSON以及更多嵌套对象和数组。
我正在寻找的理想解决方案是将JSON映射到POCO类,忽略从第一个无效令牌开始的所有内容或类似的内容。
答案 0 :(得分:3)
您的解决方案可能是使用JsonReader
using (FileStream s = File.Open("broken.json", FileMode.Open))
using (StreamReader sr = new StreamReader(s))
using (JsonReader reader = new JsonTextReader(sr))
{
while (reader.Read())
{
// deserialize only when there's "{" character in the stream
if (reader.TokenType == JsonToken.StartObject)
{
//Your code
}
}
}
答案 1 :(得分:0)
您是否有理由不能将两个缺少的字符添加到字符串然后反序列化?
我知道这似乎太明显但只是因为:
jsonString + ="]}&#34 ;;
然后反序列化jsonString。