Json确定属性

时间:2018-11-26 17:27:58

标签: c# json.net

所以我有一个返回对象列表的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进行反序列化。 手动方法是唯一的方法吗?

2 个答案:

答案 0 :(得分:1)

通常,我发现检查JSON负载是否为成员的最好方法是反序列化它们并检查内容。就您而言:

User resp = JsonConvert.DeserializeObject<User>(content);
bool userHasFirstName = !string.IsNullOrWhitespace(resp.Firstname);

但是,等等,您可能会问,如果我有不可为空的字段并且有效载荷中不存在这些字段会怎样?对此,我有两个答复:

  1. 如果您不确定确定在那里有一个值,那么您希望从JSON反序列化的任何内容上都没有不可空字段。或者,
  2. 在属性中添加[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]
}