有没有办法验证字符串是否是C#中的JSON格式?

时间:2017-03-23 08:05:46

标签: c# json json.net

我尝试使用code I found in this answer: -

        strInput = strInput.Trim();
        if ((strInput.StartsWith("{") && strInput.EndsWith("}")) || //For object
            (strInput.StartsWith("[") && strInput.EndsWith("]"))) //For array
        {
            try
            {
                var obj = JToken.Parse(strInput);
                return true;
            }
            catch (JsonReaderException jex)
            {
                //Exception in parsing json
                Console.WriteLine(jex.Message);
                return false;
            }
            catch (Exception ex) //some other exception
            {
                Console.WriteLine(ex.ToString());
                return false;
            }
        }
        else
        {
            return false;
        }

此代码的问题在于,它将错误的JSON文件验证为正确,因为JToken.Parse会自动删除序列中加倍的元素,例如:

{
   "Body" : {
      "Data" : {}
   },
   "Head" : {
      "RequestArguments" : {
         "Scope" : ""
      },
      "Status" : {
         "Code" : 255,
         "Reason" : "CGI-Args: Invalid parameter '' for Scope.",
         "UserMessage" : ""
      },
      "Timestamp" : "2017-01-24T13:15:33+01:00"
   },
   "Head" : {
      "RequestArguments" : {
         "Scope" : ""
      },
      "Status" : {
         "Code" : 255,
         "Reason" : "CGI-Args: Invalid parameter '' for Scope.",
         "UserMessage" : ""
      },
      "Timestamp" : "2017-01-24T13:15:33+01:00"
   }
}

这里有2个不允许的同一级别的头部令牌,但是JToken会自动解析2个头部令牌中的一个,因此生成的对象有效

1 个答案:

答案 0 :(得分:-1)

您可以修改此代码以检查JToken.Parse()结果中的元素。如果值重复,则可以返回false