#c# #asp.net-web-api #customvalidator #jsonresponse
#c# #asp.net-web-api #customvalidator #jsonresponse
Вопрос:
Я пытаюсь создать несколько пользовательских средств проверки, которые проверяют разные классы, и объединить их в ответ JSON, используя ошибки проверки и классы.
Ответ JSON, которого я пытаюсь достичь, имеет следующий формат
{
"meta": {
"apiVersion": "1.0"
},
"data": {
"customer": {
"title": "Title",
"firstName": "FNAME",
"lastName": "LNAME",
"email": "EMAIL"
}
},
"errors": {
"error": {
"code": "CODE",
"message": "MESSAGE",
"value": "VALUE"
},
"customer": {
// this is dynamic depending on the validation results
"firstName": {
"code": "CODE",
"message": "MESSAGE",
"value": "VALUE"
},
// this is dynamic depending on the validation results
"LastName": {
"code": "CODE",
"message": "MESSAGE",
"value": "VALUE"
}
}
}
}
И код C #, который я пытаюсь использовать, приведен ниже:
Meta meta = new Meta();
meta.apiVersion = "1.0";
Errors error2 = new Errors();
RootObject rObject = new RootObject();
Data data = new Data();
Customer cust = new Customer();
cust.title = "Mr";
cust.firstName = "Bob";
cust.lastName = "Joel";
cust.email = "test794@yahoo.com";
data.customer = cust;
rObject.meta = meta;
rObject.data = data;
var context = new ValidationContext(rObject.data.customer, serviceProvider: null, items: null);
var results = new List<ValidationResult>();
var isVALID = Validator.TryValidateObject(rObject.data.customer,
context, results,
validateAllProperties: true);
if (results.Count > 0)
{
foreach (var error in results)
{
dynamic t = null;
foreach (var mem in error.MemberNames)
{
t = mem.ToString();
}
t.message = error.ErrorMessage;
rObject.errors = t;
}
}
var json = JsonConvert.SerializeObject(rObject, Formatting.Indented);
Я не уверен, что двигаюсь в правильном направлении, поскольку проблема, с которой я в основном сталкиваюсь, находится внутри объекта errors, который зависит от ValidationResults . Поэтому, если есть ошибки проверки, я использую foreach
их, но основная проблема заключается в том, как создать объект в зависимости от имени поля, которое выдало ошибку, а затем добавить в него сообщение об ошибке.
Итак, если в имени была ошибка, мне нужно создать объект с именем first name и так далее.
Комментарии:
1. Вам нужно лучше понять, что вы пытаетесь сделать. JSON — это просто объект, каждое свойство которого может содержать любые необходимые типы. Например, в вашем примере JSON у вас есть свойство «errors» в качестве объекта. Это, скорее всего, лучше подойдет в качестве массива. Тогда внутри вас могут быть объекты, содержащие ошибки, однако похоже, что способ, которым вы пытаетесь подойти к этому, слишком тесно связан со структурой вашего
Customer
типа. Ваши ошибки должны быть ошибками, а не клиентами.2. @krillgar Спасибо за ваш ответ. Я решил эту проблему, используя приведенный ниже код словаря. также я согласен с вами, что ошибки должны быть ошибками, но, к сожалению, я не контролирую, что мне просто нужно использовать json в этом формате, отсюда и все беспорядочные ошибки errors= new Errors(); Dictionary<строка, ошибка> dic = новый словарь <строка, ошибка>();