业务规则很简单。我们有一个方法将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);
答案 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");
}