C# Json确定属性
所以我有一个api,它返回一个对象列表。 对象可能并不总是设置所有属性,我需要确定Json响应中存在哪些属性值 例如,用户对象,在某些情况下可以设置Firstname,但在某些情况下不能设置Firstname,因此我如何知道这一点,而无需手动查看Json响应并检查每个单独的属性名是否存在 一个Json示例C# Json确定属性,c#,json.net,C#,Json.net,所以我有一个api,它返回一个对象列表。 对象可能并不总是设置所有属性,我需要确定Json响应中存在哪些属性值 例如,用户对象,在某些情况下可以设置Firstname,但在某些情况下不能设置Firstname,因此我如何知道这一点,而无需手动查看Json响应并检查每个单独的属性名是否存在 一个Json示例 { "id": 250, "gender": "M", "country_code": "GR", "create_da
{
"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);
但是,等等,你可能会问,如果我有不可为空的字段,而它们不在有效负载上,会发生什么?对此,我有两个回应:
[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);
但是,等等,你可能会问,如果我有不可为空的字段,而它们不在有效负载上,会发生什么?对此,我有两个回应:
[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
进行比较,就可以实现同样的效果。唯一需要使用默认值的时间是