Как преобразовать json файл в json объект массива для десериализации в C# MVC модель - PullRequest
0 голосов
/ 09 марта 2020

Мне нужно преобразовать файл json, чтобы он соответствовал параметру viewmodel для записи WebAPI 2 (язык C#). Но когда он попадает в контроллер API, параметр (данные из тела) имеет значение null.

My. json, файл для настройки в соответствии с моей моделью

{
  "Data": {
     "DataHeader": {
         "MessageTrackingIdentifier": "18c64415-05cc-415e-9cf1-034bdc4dbdac",
         "MessageName": "USERS"
      },
     "DataDetail": [
         {
             "CustomerCode": "0002888802",
             "CustomerName": "SGG (Pty) Limited        "
         },
         {
             "CustomerCode": "0002034092",
             "CustomerName": "AAG  (Pty) Limited        "
         }
     ]
  }
}

Моя модель:

public class TUserModel
{
    public TUserDataModel Data { get; set; }
}

public class TUserDataModel
{
    public TDataHeader DataHeader { get; set; }
    public List<TUserModelDataDetail> DataDetail { get; set; }
}

public class TUserModelDataDetail
{
    public string CustomerCode { get; set; }
    public string CustomerName { get; set; }
}


public class TDataHeader
{
    public string MessageTrackingIdentifier { get; set; }
    public string MessageName { get; set; }
}

Действие My WebAPI 2

public IHttpActionResult PostUser([FromBody] TUserModel model)

Ajax postfunction:

   function PostUserData(viewModel)
    {
        var model = JSON.stringify(viewModel);

        $.ajax({
            url: "http://localhost:60667/api/User",
            type: "POST",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            crossDomain: true,
            data: model,            
            success: function (reply)
            {
                $('.js-call-UserApi').css("background", "green");   
            },
            error: function (jqXHR, errorData)
            {
                alert('error: ' + JSON.stringify(jqXHR.responseText, errorData));
            }
        });
    }

Вызов js файла для функции Ajax Post : (имя файла, которое он читает, 'UserFA. json')

    var oXHR = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');

    function reportStatus()
    {
        if (oXHR.readyState == 4)                    // Request completed.
            PostUserData(this.responseText);         // All set. Now show the data.
    }

    oXHR.onreadystatechange = reportStatus;
    oXHR.open("GET", "UserFA.json", true);          // true = ASYNCHRONOUS REQUEST (DESIRABLE), false = SYNCHRONOUS REQUEST.
    oXHR.send();

Редактировать: файл, прочитанный и заформатированный и очищенный от символов форматирования

"{"Data": 
     {"DataHeader": {"MessageTrackingIdentifier": "18c64415-05cc-415e-9cf1-034bdc4dbdac", "MessageName": "USERS"},
      "DataDetail": 
   [      
        { "CustomerCode": "0002888802    ", "CustomerName": "SGG (Pty) Limited      "},
        { "CustomerCode": "0002034092    ", "CustomerName": "AAG  (Pty) Limited      "}
       ]  
     }
 }"

Спасибо

1 Ответ

0 голосов
/ 09 марта 2020

Ваша json и модель не совсем совпадают. У json есть объект с именем «Данные», который затем содержит «DataHeader» и «DataDetail» - но в вашей модели все эти свойства находятся на одном уровне в вашем объекте TUserModel, а Data - это строка, а не объект. Если вы хотите изменить модель, чтобы она соответствовала json, вам нужно изменить TUserModel на:

public class TUserModel
{
    public TUserDataModel Data { get; set; }
}

и добавить промежуточный объект, который я называю TUserDataModel:

public class TUserDataModel
{
    public TDataHeader DataHeader { get; set; }
    public List<TUserModelDataDetail> DataDetail { get; set; }
}

Если вы хотите изменить json и оставить модель в основном той же самой, то удалите уровень «Данные», перемещая DataHeader и DataDetail вверх. Затем вы также можете удалить строковое свойство «Данные» из вашего класса TUserModel.

{
   "DataHeader": {
       ...
   },
   "DataDetail": [
      ...
   ]
}
...