C# Json确定属性

C# Json确定属性,c#,json.net,C#,Json.net,所以我有一个api,它返回一个对象列表。 对象可能并不总是设置所有属性,我需要确定Json响应中存在哪些属性值 例如,用户对象,在某些情况下可以设置Firstname,但在某些情况下不能设置Firstname,因此我如何知道这一点,而无需手动查看Json响应并检查每个单独的属性名是否存在 一个Json示例 { "id": 250, "gender": "M", "country_code": "GR", "create_da

所以我有一个api,它返回一个对象列表。 对象可能并不总是设置所有属性,我需要确定Json响应中存在哪些属性值

例如,用户对象,在某些情况下可以设置Firstname,但在某些情况下不能设置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进行反序列化。
手动方法是唯一的方法吗?

一般来说,我发现检查JSON有效负载成员资格的最佳方法是对其进行反序列化并检查内容。就你而言:

User resp = JsonConvert.DeserializeObject<User>(content);
bool userHasFirstName = !string.IsNullOrWhitespace(resp.Firstname);
User resp=JsonConvert.DeserializeObject(内容);
bool userHasFirstName=!string.IsNullOrWhitespace(分别为Firstname);
但是,等等,你可能会问,如果我有不可为空的字段,而它们不在有效负载上,会发生什么?对此,我有两个回应:

  • 如果您不确定在JSON中是否会有值,那么在您希望从JSON反序列化的任何内容上都没有不可为空的字段。或者
  • [JsonProperty(DefaultValueHandling=DefaultValueHandling.Populate)]
    [DefaultValue(您的默认值)]
    属性添加到属性中

  • 请注意,您始终可以将JSON响应作为文本字符串进行检查,并且有一些库允许您将JSON响应作为对象进行检查。我提供的是最简单和最广泛的用例。

    一般来说,我发现检查JSON有效负载成员资格的最佳方法是对其进行反序列化并检查内容。就你而言:

    User resp = JsonConvert.DeserializeObject<User>(content);
    bool userHasFirstName = !string.IsNullOrWhitespace(resp.Firstname);
    
    User resp=JsonConvert.DeserializeObject(内容);
    bool userHasFirstName=!string.IsNullOrWhitespace(分别为Firstname);
    
    但是,等等,你可能会问,如果我有不可为空的字段,而它们不在有效负载上,会发生什么?对此,我有两个回应:

  • 如果您不确定在JSON中是否会有值,那么在您希望从JSON反序列化的任何内容上都没有不可为空的字段。或者
  • [JsonProperty(DefaultValueHandling=DefaultValueHandling.Populate)]
    [DefaultValue(您的默认值)]
    属性添加到属性中

  • 请注意,您始终可以将JSON响应作为文本字符串进行检查,并且有一些库允许您将JSON响应作为对象进行检查。我提供的是最简单和最广泛的用例。

    我认为
    JsonPropertyAttribute
    不适合您的情况,您实际上需要序列化所有属性,但是当您需要它时,您可以反序列化它,然后只想将子集返回给客户端

    您可以为客户端返回
    匿名json格式
    ,而无需强键入,特别是当您只想返回结果的子集时

    例如,您得到的
    用户
    是:

    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>()
    })
    

    我不认为
    JsonPropertyAttribute
    适合您的情况,您实际上需要序列化所有属性,但当您需要它时,您可以反序列化它,然后只想将子集返回给客户端

    您可以为客户端返回
    匿名json格式
    ,而无需强键入,特别是当您只想返回结果的子集时

    例如,您得到的
    用户
    是:

    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>()
    })
    

    我们需要json示例和类的外观。Json.NET应该很容易支持这个场景,但是如果没有看到您的尝试,我们就无法帮助Json.NET将很高兴地反序列化它,所以我认为这不是您真正的问题。你说“我需要确定Json响应中存在哪些属性值”,那么你是在问如何分辨反序列化后设置了哪些属性?你的用户类(不是对象)中可能有Json中没有表示的属性。任何东西都不会爆炸或坠毁。JSON可以表示类中不存在的属性。任何东西都不会爆炸或坠毁。而且很容易测试。@stuartd确实这正是我想要的,如果我的问题不清楚,很抱歉。我们需要json示例和类的外观,而不是将类反序列化到字典,以便您可以测试密钥。Json.NET应该很容易支持这个场景,但是如果没有看到您的尝试,我们就无法帮助Json.NET将很高兴地反序列化它,所以我认为这不是您真正的问题。你说“我需要确定Json响应中存在哪些属性值”,那么你是在问如何分辨反序列化后设置了哪些属性?你的用户类(不是对象)中可能有Json中没有表示的属性。任何东西都不会爆炸或坠毁。JSON可以表示类中不存在的属性。任何东西都不会爆炸或坠毁。而且测试也很容易。@stuartd确实这正是我想要的,如果我的问题不清楚,很抱歉。不是将类反序列化到字典,这样您就可以测试一个键,您建议使用一些默认值,我可以检查这些值,并确定是否设置了这些值?我想这是可行的,因为我所有的值都可以为null。@NullReference如果你所有的值都可以为null,只需将它们与
    null
    进行比较,就可以实现同样的效果。您唯一想使用默认值的时候是,如果您有不可为null的属性类型,如
    int
    bool
    @NullReference抱歉,我应该说明您只需要执行其中一个选项,不是两个都有。所以你建议使用一些默认值,我可以对照这些值进行检查并确定是否设置了这些值?我想这是可行的,因为我所有的值都可以为null。@NullReference如果你所有的值都可以为null,只需将它们与
    null
    进行比较,就可以实现同样的效果。唯一需要使用默认值的时间是