检查JObject包含一个数组

时间:2016-10-18 21:01:58

标签: c# json json.net

业务规则很简单。我们有一个方法将JObject作为parm。将其转换为c#poco。

json需要代表一个对象。

不允许使用数组。如果你需要这样做三次,请三次调用该方法。

所以例如这将是有效的json:

{
   "CustomerId": 669616948,
   "FirstName": "ERIC",
   "LastName": "TEST2",
   "BirthYear": 0,
   "BirthMonth": 0,
   "CustomerState": 0,
   "LegalAddressState": null,
   "Username": "ERIC2222"
}

这不会:

{
  "Participants": [
    {
      "CustomerId": 669616948,
      "FirstName": "ERIC",
      "LastName": "TEST2",
      "BirthYear": 0,
      "BirthMonth": 0,
      "CustomerState": 0,
      "LegalAddressState": null,
      "Username": "ERIC2222"
     }
  ]
}

目前,当它尝试转换为poco并且我们可以处理异常时抛出异常,我正在寻找一种方法来检测JObject是否包含一个数组并正常退出。

所以上面的json只是JObject的样子,但它是一个JObject。

我能想到的最好的是一个可靠的字符串检查。

JObject.ToString().Contains("[")

有关如何进行数组检查的任何想法。如果我能以某种方式将它转换为JToken然后我可以这样做(temp是JToken类型):

temp.Type == JTokenType.Array 

TIA

这里要求的是转换。有效载荷是一个JObject。

var customer = payload.ToObject<Customer>(_serializer);

3 个答案:

答案 0 :(得分:0)

这是怎么回事?

dynamic value = jToken["Participants"];
if (value != null && value is JArray)
{
 //gracefully exit.
}

答案 1 :(得分:0)

您始终可以编写一个自定义JsonConverter来遍历json树(使用此答案中描述的技术https://stackoverflow.com/a/19646950/1165998),同时检查{{1}的类型和值类型如果是,则返回null:

JArray

这将在您的第一个示例中返回反序列化的数据,并在第二个示例中返回null。

答案 2 :(得分:0)

我不太确定您的要求。但这是一种方法:

        [TestMethod]
        public void DeserializeTest()
        {
            var jsonStr1 = "{\"CustomerId\": 669616948,\"FirstName\": \"ERIC\",\"LastName\": \"TEST2\",\"BirthYear\": 0,\"BirthMonth\": 0,\"CustomerState\": 0,\"LegalAddressState\": null,\"Username\": \"ERIC2222\"}";
            JToken token1 = JToken.Parse(jsonStr1);
            var participantsFromToken1 = token1["Participants"];
            Console.WriteLine(participantsFromToken1 != null && participantsFromToken1.Type == JTokenType.Array
                ? "Hey, token1 is an array"
                : "Hey, token1 is not an array");


            var jsonStr2 =
                "{\"Participants\": [{\"CustomerId\": 669616948,\"FirstName\": \"ERIC\",\"LastName\": \"TEST2\",\"BirthYear\": 0,\"BirthMonth\": 0,\"CustomerState\": 0,\"LegalAddressState\": null,\"Username\": \"ERIC2222\"}]}";
            JToken token2 = JToken.Parse(jsonStr2);

            var participantsFromToken2 = token2["Participants"];
            Console.WriteLine(participantsFromToken2 != null && participantsFromToken2.Type == JTokenType.Array
                ? "Hey, token2 is an array"
                : "Hey, token2 is not an array");
        }