.net Создание ответа JSON путем объединения пользовательского валидатора и его класса

#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 = новый словарь <строка, ошибка>();