如何从.net中的不完整JSON反序列化字段?

时间:2018-02-01 16:18:57

标签: c# .net json.net

我有不完整的JSON字符串,因此JSON无效,例如:

{
    "Id": 0,
    "Name": "John",
    "Surname": "Smith",
    "BadAnswers": ["Answer1", "Answer2"],
    "CorrectAnswers": ["Answer3", "Answer4", "Answer5", "Answ

从这个JSON我需要提取完整的IDNameBadAnswers字段。我不能使用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类,忽略从第一个无效令牌开始的所有内容或类似的内容。

2 个答案:

答案 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。