如何验证 JObject 是否属于特定类型



我需要弄清楚JObject是否具有与自定义对象类型匹配的正确属性。我正在使用 JObject.ToObject,希望如果属性与自定义对象不匹配,它会失败,但它仍然创建所有属性为 null 的自定义对象。

无论如何,我可以在调用ToObject之前对其进行验证吗?

class CustomObject
{
string fname;
string lname;
}
void test()
{
string json = "{"User": "Hello"}";
JObject jsonObj = JObject.Parse(json);
CustomObject custObj = null;

// this always creates CustomObject instance
// I need to validate that jsonObj has valid attributes that match CustomObject
custObj = JObject.ToObject<CustomObject>(); 

编辑:您可以使用[JsonRequiredAttribute]

class CustomObject
{
[JsonRequiredAttribute]
string fname;
[JsonRequiredAttribute]
string lname;
}

或者,您可以使用 Newtonsoft.Json.Schema 来验证:

var schema = JSchema.Parse(@"{ 
'type': 'object',
'properties': {
'fname': { 'type': 'string' },
'lname': { 'type': 'string' }
},
'additionalProperties': false,
'required': ['name', 'email']
}");
var jsonObj = JObject.Parse("{"User": "Hello"}");
// throws if not valid
jsonObj.Validate(schema);
// or, if you want to handle it yourself
if (!jsonObj.IsValid(schema, out IList<ValidationError> errors))
{
// ...
}
// if all pass
var custObj = jsonObj.ToObject<CustomObject>();
public class CustomObject
{
[JsonProperty("FirstName")]
string fname { get; set; }
[JsonProperty("LastName")]
string lname { get; set; }
}
public void Test()
{
Dictionary<string, string> collection = new Dictionary<string, string>();
collection.Add("FirstName", "Test");
collection.Add("LastName", "1234");
JObject jsobObj = JObject.Parse(JsonConvert.SerializeObject(collection, Newtonsoft.Json.Formatting.Indented));
CustomObject custObj = new CustomObject();
if (jsobObj != null)
{
if (jsobObj.Property("FirstName") != null && jsobObj.Property("LastName") != null)
{
custObj = jsobObj.ToObject<CustomObject>();
}
}
}

您可以使用.SelectToken()从具有多个不同对象的较大 json 中获取特定对象。

对于您的特定示例,它看起来像这样。

custObj = (CustomObject)jsonObj.SelectToken("CustomObject");

您要将选定的令牌强制转换为CustomObject,然后将其分配给custObj变量。

从 SelectToken(( 的文档中,如果在给定的 JObject 中找不到令牌,则会创建一个空引用。

最新更新