所以我有一个返回对象列表的api。 这些对象可能并不总是设置所有属性,因此我需要确定Json响应中存在哪些属性值。
例如User对象,在某些情况下可以设置Firstname,因此在不手动检查Json响应并检查每个属性名称是否存在的情况下,我怎么能知道呢?
Json示例
{
"id": 250,
"gender": "M",
"country_code": "GR",
"create_datetime": "2018-11-08T17:20:56+0800"
}
然后
{
"id": 250,
"create_datetime": "2018-11-08T17:20:56+0800"
}
我使用JsonConvert.DeserializeObject进行反序列化。 手动方法是唯一的方法吗?
答案 0 :(得分:1)
通常,我发现检查JSON负载是否为成员的最好方法是反序列化它们并检查内容。就您而言:
User resp = JsonConvert.DeserializeObject<User>(content);
bool userHasFirstName = !string.IsNullOrWhitespace(resp.Firstname);
但是,等等,您可能会问,如果我有不可为空的字段并且有效载荷中不存在这些字段会怎样?对此,我有两个答复:
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)]
和[DefaultValue(YOUR_DEFAULT_VALUE)]
属性请注意,您始终可以将JSON响应作为文本字符串进行检查,并且有些库可让您将JSON响应作为对象进行检查。我提供的是最简单,最广泛的用例。
答案 1 :(得分:1)
我不认为JsonPropertyAttribute
适用于您的情况,实际上您需要序列化所有属性,但是当需要时,可以对它进行反序列化,然后只想将子集返回给客户端即可。
您可以为客户返回anonymous json format
,而无需进行强行输入,尤其是当您只想返回结果的子集时。
例如,您获得的user
是:
var user = new User
{
Id = "1",
FirstName = "Foo",
LastName = "Bar",
Gender = "None",
Orders =[{ Id, time,.....}]
};
但是如果要返回一个子集:
return Json(new
{
Id = user?.Id,
Orders = user?.Orders?.Select(x => x.Id) ?? Enumerable.Empty<int>()
})
然后客户将获得:
{
Id: xxx,
Orders: [1,2,3,4]
}