Как преобразовать Json Array of Json Objects в XML C # - PullRequest
0 голосов
/ 08 января 2019

Привет, у меня есть JS Knockout View Model, отправляющая обратно в мое веб-приложение asp объект Json, который выглядит следующим образом

[
  {
    "ID": "GRP2-SYSPRO|SysproComapnyF|0000003774|0003",
    "Requisition": "0000003774",
    "ReqnStatus": "Approved awiting Purchase Order",
    "DateReqnRaised": "2018-03-15T00:00:00",
    "ReqnValue": 573.4,
    "ApprovedValue": 0.0,
    "Originator": "*",
    "OrigName": "**********",
    "OrigEmail": "********@exidor.co.uk",
    "Line": 3.0,
    "INDX": 1,
    "DateReqnRaisedL": "15/03/18",
    "ReqStatus": "W",
    "ReqBackground": "card-heading bg-primary text-white"
  },
  {
    "ID": "GRP2-SYSPRO|SysproComapnyF|0000004304|0001",
    "Requisition": "0000004304",
    "ReqnStatus": "Approved awiting Purchase Order",
    "DateReqnRaised": "2018-08-06T00:00:00",
    "ReqnValue": 550.0,
    "ApprovedValue": 0.0,
    "Originator": "*",
    "OrigName": "********",
    "OrigEmail": "********@exidor.co.uk",
    "Line": 1.0,
    "INDX": 2,
    "DateReqnRaisedL": "06/08/18",
    "ReqStatus": "W",
    "ReqBackground": "card-heading bg-primary text-white"
  },
  {
    "ID": "GRP2-SYSPRO|SysproComapnyF|0000004434|0001",
    "Requisition": "0000004434",
    "ReqnStatus": "Awaiting Approval",
    "DateReqnRaised": "2018-09-19T00:00:00",
    "ReqnValue": 0.0,
    "ApprovedValue": 0.0,
    "Originator": "*",
    "OrigName": "********",
    "OrigEmail": "********@exidor.co.uk",
    "Line": 1.0,
    "INDX": 3,
    "DateReqnRaisedL": "19/09/18",
    "ReqStatus": "W",
    "ReqBackground": "card-heading bg-primary text-white"
  },
  {
    "ID": "GRP2-SYSPRO|SysproComapnyF|0000004550|0001",
    "Requisition": "0000004550",
    "ReqnStatus": "Approved awiting Purchase Order",
    "DateReqnRaised": "2018-10-30T00:00:00",
    "ReqnValue": 42.32,
    "ApprovedValue": 0.0,
    "Originator": "*",
    "OrigName": "********",
    "OrigEmail": "********@exidor.co.uk",
    "Line": 1.0,
    "INDX": 4,
    "DateReqnRaisedL": "30/10/18",
    "ReqStatus": "W",
    "ReqBackground": "card-heading bg-primary text-white"
  },
  {
    "ID": "GRP2-SYSPRO|SysproComapnyF|0000004645|0001",
    "Requisition": "0000004645",
    "ReqnStatus": "Awaiting Approval",
    "DateReqnRaised": "2018-11-30T00:00:00",
    "ReqnValue": 250.56,
    "ApprovedValue": 0.0,
    "Originator": "*",
    "OrigName": "********",
    "OrigEmail": "********@exidor.co.uk",
    "Line": 1.0,
    "INDX": 5,
    "DateReqnRaisedL": "30/11/18",
    "ReqStatus": "W",
    "ReqBackground": "card-heading bg-primary text-white"
  },
  {
    "ID": "GRP2-SYSPRO|SysproComapnyF|0000004659|0001",
    "Requisition": "0000004659",
    "ReqnStatus": "Approved awiting Purchase Order",
    "DateReqnRaised": "2018-12-04T00:00:00",
    "ReqnValue": 228.15,
    "ApprovedValue": 0.0,
    "Originator": "*",
    "OrigName": "********",
    "OrigEmail": "********@exidor.co.uk",
    "Line": 1.0,
    "INDX": 6,
    "DateReqnRaisedL": "04/12/18",
    "ReqStatus": "W",
    "ReqBackground": "card-heading bg-primary text-white"
  },
  {
    "ID": "GRP2-SYSPRO|SysproComapnyF|0000004661|0001",
    "Requisition": "0000004661",
    "ReqnStatus": "Approved awiting Purchase Order",
    "DateReqnRaised": "2018-12-05T00:00:00",
    "ReqnValue": 528.0,
    "ApprovedValue": 0.0,
    "Originator": "***",
    "OrigName": "********",
    "OrigEmail": "********@exidor.co.uk",
    "Line": 1.0,
    "INDX": 7,
    "DateReqnRaisedL": "05/12/18",
    "ReqStatus": "W",
    "ReqBackground": "card-heading bg-primary text-white"
  }
]

Контроллер должен получить этот элемент и преобразовать его в XML В идеале как то так

<data>
       <row>
         <id>GRP2-SYSPRO|SysproComapnyF|0000004334|0003</id>
         <requisition>0000004334</requisition>
         <reqnStatus>Awaiting Approval</reqnStatus>
         <dateReqnRaised>2018-08-15T00:00:00</dateReqnRaised>
         etc
       </row>
    <row>
         <id>GRP2-SYSPRO|SysproComapnyF|0000004340|0005</id>
         <requisition>0000004340</requisition>
         <reqnStatus>Awaiting Approval</reqnStatus>
         <dateReqnRaised>2018-08-27T00:00:00</dateReqnRaised>
         etc
        </row>
</data>

Можно ли это сделать?

Преобразование в контроллере обрабатывается

XmlDocument doc = JsonConvert.DeserializeXmlNode(json.ToString());

Сначала этот код, который я использовал в контроллере, не мог сериализовать xml, потому что не было root, сообщение об ошибке, которое я получил, было

"typeName": "Newtonsoft.Json.JsonSerializationException", "message": "XmlNodeConverter может конвертировать только JSON, начинающийся с объекта. Путь '', строка 1, позиция 1.",

Затем я изменяю свой код модели представления согласно здесь , поэтому моя команда post стала

self.postAllReqs = function(self) {
    self.error(''); // Clear error message
var data = JSON.stringify({ data: ko.toJSON(self.Reqs) }); // convert to json

    ajaxHelper(reqsUri, 'POST', data).fail(function (jqXHR, textStatus, errorThrown) {
        self.error(errorThrown);
    });
}

Функция ajax Helper

function ajaxHelper(uri, method, data) {
    self.error(''); // Clear error message
    return $.ajax({
        type: method,
        url: uri,
        dataType: 'json',
        contentType: 'application/json',
        data: data ? JSON.stringify( data ) : null //var json = JSON.stringify({ data: data });
    }).fail(function (jqXHR, textStatus, errorThrown) {
        self.error(errorThrown);
    });
}

Тем не менее, это теперь отправляет полезные данные обратно как

{"rows":"[{"id":"GRP2-SYSPRO|SysproComapnyF|0000003861|0001","requisition":"0000003861","reqnStatus":"Approved awiting Purchase Order","dateReqnRaised":"2018-04-06T00:00:00","reqnValue":29.3,"approvedValue":null,"originator":"***","origName":"***","origEmail":"***@exidor.co.uk","line":1,"indx":1,"dateReqnRaisedL":"06/04/18","reqStatus":"A","reqBackground":"card-heading bg-success text-white","reqStatusLabel":"Approved","approvalBtn":"css: button btn-secondary ","approvalBtnLbl":"UnApprove","declineBtnLbl":"Decline","deleteBtnLbl":"Erase"},{"id":"GRP2-SYSPRO|SysproComapnyF|0000004013|0002","requisition":"0000004013","reqnStatus":"Approved awiting Purchase Order","dateReqnRaised":"2018-05-17T00:00:00","reqnValue":60,"approvedValue":null,"originator":"***","origName":"***","origEmail":"***@exidor.co.uk","line":2,"indx":2,"dateReqnRaisedL":"17/05/18","reqStatus":"W","reqBackground":"card-heading bg-primary text-white","reqStatusLabel":"Awaiting Approval","approvalBtn":"btn btn-success ","approvalBtnLbl":"Approve","declineBtnLbl":"Decline","deleteBtnLbl":"Erase"},{"id":"GRP2-SYSPRO|SysproComapnyF|0000004427|0001","requisition":"0000004427","reqnStatus":"Approved awiting Purchase Order","dateReqnRaised":"2018-09-17T00:00:00","reqnValue":34.73,"approvedValue":null,"originator":"***","origName":"*****","origEmail":"*****@exidor.co.uk","line":1,"indx":3,"dateReqnRaisedL":"17/09/18","reqStatus":"W","reqBackground":"card-heading bg-primary text-white","reqStatusLabel":"Awaiting Approval","approvalBtn":"btn btn-success ","approvalBtnLbl":"Approve","declineBtnLbl":"Decline","deleteBtnLbl":"Erase"},{"id":"GRP2-SYSPRO|SysproComapnyF|0000004449|0001","requisition":"0000004449","reqnStatus":"Approved awiting Purchase Order","dateReqnRaised":"2018-09-24T00:00:00","reqnValue":456.9,"approvedValue":null,"originator":"*****","origName":"******","origEmail":"******@exidor.co.uk","line":1,"indx":4,"dateReqnRaisedL":"24/09/18","reqStatus":"W","reqBackground":"card-heading bg-primary text-white","reqStatusLabel":"Awaiting Approval","approvalBtn":"btn btn-success ","approvalBtnLbl":"Approve","declineBtnLbl":"Decline","deleteBtnLbl":"Erase"},{"id":"GRP2-SYSPRO|SysproComapnyF|0000004535|0002","requisition":"0000004535","reqnStatus":"Approved awiting Purchase Order","dateReqnRaised":"2018-10-24T00:00:00","reqnValue":270.39,"approvedValue":null,"originator":"*****","origName":"********","origEmail":"********@exidor.co.uk","line":2,"indx":5,"dateReqnRaisedL":"24/10/18","reqStatus":"W","reqBackground":"card-heading bg-primary text-white","reqStatusLabel":"Awaiting Approval","approvalBtn":"btn btn-success ","approvalBtnLbl":"Approve","declineBtnLbl":"Decline","deleteBtnLbl":"Erase"},{"id":"GRP2-SYSPRO|SysproComapnyF|0000004626|0001","requisition":"0000004626","reqnStatus":"Approved awiting Purchase Order","dateReqnRaised":"2018-11-26T00:00:00","reqnValue":34.59,"approvedValue":null,"originator":"***","origName":"********","origEmail":"*******@exidor.co.uk","line":1,"indx":6,"dateReqnRaisedL":"26/11/18","reqStatus":"W","reqBackground":"card-heading bg-primary text-white","reqStatusLabel":"Awaiting Approval","approvalBtn":"btn btn-success ","approvalBtnLbl":"Approve","declineBtnLbl":"Decline","deleteBtnLbl":"Erase"},{"id":"GRP2-SYSPRO|SysproComapnyF|0000004629|0001","requisition":"0000004629","reqnStatus":"Approved awiting Purchase Order","dateReqnRaised":"2018-11-26T00:00:00","reqnValue":34.44,"approvedValue":null,"originator":"****","origName":"*******","origEmail":"******@exidor.co.uk","line":1,"indx":7,"dateReqnRaisedL":"26/11/18","reqStatus":"W","reqBackground":"card-heading bg-primary text-white","reqStatusLabel":"Awaiting Approval","approvalBtn":"btn btn-success ","approvalBtnLbl":"Approve","declineBtnLbl":"Decline","deleteBtnLbl":"Erase"}]"}

Контроллер может конвертировать их в XML, но не в нужный формат. Кажется, это сводится к этому и отсутствует дочерние узлы

 <?xml version="1.0"?>
<rows>[{"id":"GRP2-SYSPRO|SysproComapnyF|0000004013|0001","requisition":"0000004013","reqnStatus":"Approved awiting Purchase Order","dateReqnRaised":"2018-05-17T00:00:00","reqnValue":60,"approvedValue":null,"originator":"***","origName":"***","origEmail":"***@exidor.co.uk","line":1,"indx":1,"dateReqnRaisedL":"17/05/18","reqStatus":"D","reqBackground":"card heading bg-secondary","reqStatusLabel":"Declined - put on hold","approvalBtn":"btn btn-success ","approvalBtnLbl":"UnApprove","declineBtnLbl":"UnDecline","deleteBtnLbl":"Erase"},{"id":"GRP2-SYSPRO|SysproComapnyF|0000004362|0001","requisition":"0000004362","reqnStatus":"Approved awiting Purchase Order","dateReqnRaised":"2018-08-29T00:00:00","reqnValue":1185,"approvedValue":null,"originator":"***","origName":"***","origEmail":"***@exidor.co.uk","line":1,"indx":2,"dateReqnRaisedL":"29/08/18","reqStatus":"W","reqBackground":"card-heading bg-primary text-white","reqStatusLabel":"Awaiting Approval","approvalBtn":"btn btn-success ","approvalBtnLbl":"Approve","declineBtnLbl":"Decline","deleteBtnLbl":"Erase"},{"id":"GRP2-SYSPRO|SysproComapnyF|0000004427|0001","requisition":"0000004427","reqnStatus":"Approved awiting Purchase Order","dateReqnRaised":"2018-09-17T00:00:00","reqnValue":34.73,"approvedValue":null,"originator":"***","origName":"***","origEmail":"***@exidor.co.uk","line":1,"indx":3,"dateReqnRaisedL":"17/09/18","reqStatus":"W","reqBackground":"card-heading bg-primary text-white","reqStatusLabel":"Awaiting Approval","approvalBtn":"btn btn-success ","approvalBtnLbl":"Approve","declineBtnLbl":"Decline","deleteBtnLbl":"Erase"},{"id":"GRP2-SYSPRO|SysproComapnyF|0000004550|0001","requisition":"0000004550","reqnStatus":"Approved awiting Purchase Order","dateReqnRaised":"2018-10-30T00:00:00","reqnValue":42.32,"approvedValue":null,"originator":"***","origName":"***","origEmail":"***@exidor.co.uk","line":1,"indx":4,"dateReqnRaisedL":"30/10/18","reqStatus":"W","reqBackground":"card-heading bg-primary text-white","reqStatusLabel":"Awaiting Approval","approvalBtn":"btn btn-success ","approvalBtnLbl":"Approve","declineBtnLbl":"Decline","deleteBtnLbl":"Erase"},{"id":"GRP2-SYSPRO|SysproComapnyF|0000004645|0001","requisition":"0000004645","reqnStatus":"Awaiting Approval","dateReqnRaised":"2018-11-30T00:00:00","reqnValue":250.56,"approvedValue":null,"originator":"***","origName":"***","origEmail":"***@exidor.co.uk","line":1,"indx":5,"dateReqnRaisedL":"30/11/18","reqStatus":"W","reqBackground":"card-heading bg-primary text-white","reqStatusLabel":"Awaiting Approval","approvalBtn":"btn btn-success ","approvalBtnLbl":"Approve","declineBtnLbl":"Decline","deleteBtnLbl":"Erase"},{"id":"GRP2-SYSPRO|SysproComapnyF|0000004652|0001","requisition":"0000004652","reqnStatus":"Approved awiting Purchase Order","dateReqnRaised":"2018-12-04T00:00:00","reqnValue":146.88,"approvedValue":null,"originator":"***","origName":"***","origEmail":"***@exidor.co.uk","line":1,"indx":6,"dateReqnRaisedL":"04/12/18","reqStatus":"W","reqBackground":"card-heading bg-primary text-white","reqStatusLabel":"Awaiting Approval","approvalBtn":"btn btn-success ","approvalBtnLbl":"Approve","declineBtnLbl":"Decline","deleteBtnLbl":"Erase"},{"id":"GRP2-SYSPRO|SysproComapnyF|0000004653|0001","requisition":"0000004653","reqnStatus":"Approved awiting Purchase Order","dateReqnRaised":"2018-12-04T00:00:00","reqnValue":80.7,"approvedValue":null,"originator":"***","origName":"***","origEmail":"***@exidor.co.uk","line":1,"indx":7,"dateReqnRaisedL":"04/12/18","reqStatus":"W","reqBackground":"card-heading bg-primary text-white","reqStatusLabel":"Awaiting Approval","approvalBtn":"btn btn-success ","approvalBtnLbl":"Approve","declineBtnLbl":"Decline","deleteBtnLbl":"Erase"},{"id":"GRP2-SYSPRO|SysproComapnyF|0000004659|0001","requisition":"0000004659","reqnStatus":"Approved awiting Purchase Order","dateReqnRaised":"2018-12-04T00:00:00","reqnValue":228.15,"approvedValue":null,"originator":"***","origName":"***","origEmail":"***@exidor.co.uk","line":1,"indx":8,"dateReqnRaisedL":"04/12/18","reqStatus":"W","reqBackground":"card-heading bg-primary text-white","reqStatusLabel":"Awaiting Approval","approvalBtn":"btn btn-success ","approvalBtnLbl":"Approve","declineBtnLbl":"Decline","deleteBtnLbl":"Erase"},{"id":"GRP2-SYSPRO|SysproComapnyF|0000004661|0002","requisition":"0000004661","reqnStatus":"Approved awiting Purchase Order","dateReqnRaised":"2018-12-05T00:00:00","reqnValue":528,"approvedValue":null,"originator":"*** ","origName":"***","origEmail":"***@exidor.co.uk","line":2,"indx":9,"dateReqnRaisedL":"05/12/18","reqStatus":"W","reqBackground":"card-heading bg-primary text-white","reqStatusLabel":"Awaiting Approval","approvalBtn":"btn btn-success ","approvalBtnLbl":"Approve","declineBtnLbl":"Decline","deleteBtnLbl":"Erase"}]</rows>

Может кто-нибудь предложить способ получить это в формате желания

 <data>
           <row>
             <id>GRP2-SYSPRO|SysproComapnyF|0000004334|0003</id>
             <requisition>0000004334</requisition>
             <reqnStatus>Awaiting Approval</reqnStatus>
             <dateReqnRaised>2018-08-15T00:00:00</dateReqnRaised>
             etc
           </row>
        <row>
             <id>GRP2-SYSPRO|SysproComapnyF|0000004340|0005</id>
             <requisition>0000004340</requisition>
             <reqnStatus>Awaiting Approval</reqnStatus>
             <dateReqnRaised>2018-08-27T00:00:00</dateReqnRaised>
             etc
            </row>
    </data>

Код контроллера

// POST: api/ReqsTests
    public async Task<IHttpActionResult> PostReqsTest(object json)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }
        //convert the Json object to xml
        string xml = json.ToString();
        XmlDocument doc = JsonConvert.DeserializeXmlNode(xml);

        try
        {
            //SQL store procedure
            SqlParameter param1 = new SqlParameter("@XmlIn", doc.InnerXml);
           db.Database.ExecuteSqlCommand("exec [CHC_Web].[TestWebHandShake] @XmlIn",
                                          param1);
        }
        catch (Exception e)
        {
            string message = e.Message;
            return ResponseMessage(Request.CreateErrorResponse(HttpStatusCode.InternalServerError, message));
        }

        return ResponseMessage(Request.CreateResponse(HttpStatusCode.OK,"Inserted to database"));
    }

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...