首页 > 解决方案 > 验证具有空对象的 JsonArray 的 json

问题描述

我有一个经常监视 .json 文件结构的 Windows 服务,它一直正常工作,直到昨天我们的应用程序无法正确读取这个 .json 但被认为是有效的!:

{
    "infohead": {
        "indicator": "12",
        "istesting": "ABC_12_219",
        "isdate": "2021-08-11 10:02:12"
    },
    "headers": {
        "url": "https://www.blahblah.com/"
    },
    "advertisements": [,
        {
            "type": "arc",
            "adType": "1",
            "appn": {
                "x": 1241,
                "y": 1241,
                "z": 1243,              
            }
        },
        {
            "type": "arc2",
            "adType": "1",
            "appn": {
                "x": 1441,
                "y": 1441,
                "z": 1443,                          
            }
        }
    ]   
}

如果它在浏览器中加载,我会收到错误消息:

SyntaxError:JSON.parse:JSON 数据第 10 行第 21 列的意外字符

C# 以某种方式检测到这是正确的,数组“advertisements”具有三个对象,一个具有空值,另一个具有值。

"advertisements": [,
        {
            "type": "arc",
            "adType": "1",
            "appn": {
                "x": 1241,
                "y": 1241,
                "z": 1243,              
            }
        },
        {
            "type": "arc2",
            "adType": "1",
            "appn": {
                "x": 1441,
                "y": 1441,
                "z": 1443,                          
            }
        }
    ]   

我也使用了这个问题中描述的方法,

如何使用 JSON.NET 确保字符串是有效的 JSON

我不想使用 JSON 模式(验证 Json 模式 C#)进行验证,还有另一种执行验证的解决方案吗?

标签: c#jsonjson.net

解决方案


我尝试了建议的解决方案,甚至尝试使用 REGEX 也没有成功,实际上我发现了一些有趣的东西,例如,如果我尝试反序列化“json”的内容,则使用此方法:

WebClient client = new WebClient();
string jsonContent= client.DownloadString(jsonFile);
dynamic myJson = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonContent);

我没有例外,内容将“未定义”值显示为 JsonArray 内的对象:

"advertisements": [undefined,
        {
            "type": "arc",
            "adType": "1",
            "appn": {
                "x": 1241,
                "y": 1241,
                "z": 1243,              
            }
        },
        {
            "type": "arc2",
            "adType": "1",
            "appn": {
                "x": 1441,
                "y": 1441,
                "z": 1443,                          
            }
        }
    ]   

所以现在我的“解决方案”正在使用JToken.Parse(...)并在内容中查找“未定义”字符串:-(。

   WebClient client = new WebClient();
   string myJSON = client.DownloadString(jsonFile);
   var obj = JToken.Parse(myJSON);
   if (obj.ToString().Contains("undefined")) //Check for "undefined" values.
    {
      //Json content not valid for processing.                 
    }
    else
    {
     //Json content is valid!
    }

推荐阅读