2016-02-15 2 views
2

Я пытаюсь преобразовать JSON, отправленный с клиента веб-браузера на сервер, чтобы я мог отправлять данные в виде XML-данных в базу данных SQL. Я изо всех сил стараюсь сделать это, поскольку у меня есть объекты внутри объектов, и я не уверен, как их динамически преобразовывать в структурированный формат XML. Ниже приведены примеры использования JSON, возможные форматы XML, которые я пытаюсь включить (или что-то близкое к ним), и код, который я использую.C# конвертировать объект JSON в XML динамически

JSON:

[ 
    {"value":50,"name":"desired_gross_margin","type":"int"}, 
    {"value":50,"name":"desired_adjusted_gross_margin","type":"int"}, 
    {"value":0,"name":"target_electricity_tariff_unit_charge","type":"decimal"}, 
    {"value":0,"name":"target_electricity_tariff_standing_charge","type":"decimal"}, 
    {"value":0,"name":"target_gas_tariff_unit_charge","type":"decimal"}, 
    {"value":0,"name":"target_gas_tariff_standing_charge","type":"decimal"}, 
    {"value":"10/10/2016","name":"planned_go_live_date","type":"DateTime"}, 
    {"value":"0","name":"assumed_fuel_ratio","type":"int"}, 
    {"value":{ 
     "year_one":"Cold", 
     "year_two":"Average", 
     "year_three":"Warm" 
     }, 
    "name":"weather_variable","type":"string"} 
] 

Возможные XML выходы:

1:

<Filters> 
    <CustomerParameters> 
     <CustomParameter name="desired_gross_margin" type="int" value="50"/> 
     <CustomParameter name="desired_adjusted_gross_margin" type="int" value="50"/> 
     <CustomParameter name="target_electricity_tariff_unit_charge" type="decimal" value="0"/> 
     <CustomParameter name="target_electricity_tariff_standing_charge" type="decimal" value="0"/> 
     <CustomParameter name="target_gas_tariff_unit_charge" type="decimal" value="0"/> 
     <CustomParameter name="target_gas_tariff_standing_charge" type="decimal" value="0"/> 
     <CustomParameter name="planned_go_live_date" type="DateTime" value="10/10/2016"/> 
     <CustomParameter name="assumed_fuel_ratio" type="int" value="0"/> 
     <CustomParamaters name="weather_variables"> 
      <CustomParameter name="year_one" type="string" value="Cold"/> 
      <CustomParameter name="year_two" type="string" value="Average"/> 
      <CustomParameter name="year_three" type="string" value="Cold"/> 
     </CustomParameters> 
    </CustomParameters> 
</Filters> 

2:

<?xml version="1.0" encoding="UTF-8" ?> 
    <0> 
     <value>50</value> 
     <name>desired_gross_margin</name> 
     <type>int</type> 
    </0> 
    <1> 
     <value>50</value> 
     <name>desired_adjusted_gross_margin</name> 
     <type>int</type> 
    </1> 
    <2> 
     <value>0</value> 
     <name>target_electricity_tariff_unit_charge</name> 
     <type>decimal</type> 
    </2> 
    <3> 
     <value>0</value> 
     <name>target_electricity_tariff_standing_charge</name> 
     <type>decimal</type> 
    </3> 
    <4> 
     <value>0</value> 
     <name>target_gas_tariff_unit_charge</name> 
     <type>decimal</type> 
    </4> 
    <5> 
     <value>0</value> 
     <name>target_gas_tariff_standing_charge</name> 
     <type>decimal</type> 
    </5> 
    <6> 
     <value>10/10/2016</value> 
     <name>planned_go_live_date</name> 
     <type>DateTime</type> 
    </6> 
    <7> 
     <value>0</value> 
     <name>assumed_fuel_ratio</name> 
     <type>int</type> 
    </7> 
    <8> 
     <value> 
      <year_one>Cold</year_one> 
      <year_two>Average</year_two> 
      <year_three>Warm</year_three> 
     </value> 
     <name>weather_variable</name> 
     <type>string</type> 
    </8> 
</xml> 

С код #:

ForecastController.cs:

using Newtonsoft.Json; 
using Newtonsoft.Json.Linq; 
using System; 
using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.Configuration; 
using System.Data; 
using System.Data.SqlClient; 
using System.Linq; 
using System.Net; 
using System.Net.Http; 
using System.Text; 
using System.Web.Http; 
using System.Web.Script.Serialization; 
using System.Xml; 

namespace ForecastServices.Controllers 
{ 
    public class ForecastController : ApiController 
    { 
     [HttpPost] 
     public List<Data> GetData(HttpRequestMessage request) 
     { 
      string connection_string = ConfigurationManager.ConnectionStrings["Database"].ConnectionString; 
      string sql = "DataHub.get_GrossMarginModel"; 
      string json = request.Content.ReadAsStringAsync().Result; 
      //var filters2 = new JavaScriptSerializer().Deserialize<dynamic>(json); //this works but I can't turn it into XML! :(
      List<Filter> filters = new JavaScriptSerializer().Deserialize<List<Filter>>(json); 

      string xml = Filter.getFilterListXML(filters); 

      List<Data> data = new List<Data>(); 

      using(SqlConnection connection = new SqlConnection(connection_string)) 
      { 
       connection.Open(); 
       SqlCommand cmd = connection.CreateCommand(); 
       cmd.CommandText = sql; 
       cmd.Parameters.Add(new SqlParameter("filter_xml", "")); 
       cmd.CommandType = CommandType.StoredProcedure; 

       var adapter = new SqlDataAdapter(cmd); 
       var set = new DataSet(); 
       cmd.ExecuteNonQuery(); 
       adapter.Fill(set); 

       if (set.Tables.Count > 0) 
       { 
        foreach (DataRow tableRow in set.Tables[0].Rows) 
        { 
         data.Add(new Data() 
         { 
          name = tableRow.ItemArray[0].ToString(), 
          year_one = (int)tableRow.ItemArray[1], 
          year_two = (int)tableRow.ItemArray[2], 
          year_three = (int)tableRow.ItemArray[3], 
         }); 
        } 
       } 
       connection.Close(); 
      } 
      return data; 
     } 
    } 
} 

Filter.cs:

using Newtonsoft.Json.Linq; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Web; 

namespace ForecastServices.Domain 
{ 
    public class Filter 
    { 
     public string value { get; set; } 
     public string name { get; set; } 
     public string type { get; set; } 

     public string getXML() 
     { 
      return string.Format("<CustomParameter name=\"{0}\" type=\"{1}\" value=\"{2}\"/>", name, type, value); 
     } 

     public static string getFilterListXML(ICollection<Filter> filters) 
     { 
      StringBuilder XMLString = new StringBuilder(); 
      XMLString.Append("<Filters><CustomerParameters>"); 
      foreach (Filter f in filters) 
      { 
       XMLString.Append(f.getXML()); 
      } 
      XMLString.Append("</CustomParameters></Filters>"); 
      return XMLString.ToString(); 
     } 
    } 
} 

ответ

2

Не основываясь на текущем коде, вы посмотрите на this question

может Используя этот Однострочник:

XmlDocument doc = JsonConvert.DeserializeXmlNode("{\"Row\":" + json + "}", "root"); // JSON needs to be an object 

Вы можете в конечном итоге:

<root> 
<Row> 
    <value>50</value> 
    <name>desired_gross_margin</name> 
    <type>int</type> 
    </Row> 
<Row> 
    <value>50</value> 
    <name>desired_adjusted_gross_margin</name> 
    <type>int</type> 
    </Row> 
<Row> 
    <value>0</value> 
    <name>target_electricity_tariff_unit_charge</name> 
    <type>decimal</type> 
    </Row> 
<Row> 
    <value>0</value> 
    <name>target_electricity_tariff_standing_charge</name> 
    <type>decimal</type> 
    </Row> 
<Row> 
    <value>0</value> 
    <name>target_gas_tariff_unit_charge</name> 
    <type>decimal</type> 
    </Row> 
<Row> 
    <value>0</value> 
    <name>target_gas_tariff_standing_charge</name> 
    <type>decimal</type> 
    </Row> 
<Row> 
    <value>10/10/2016</value> 
    <name>planned_go_live_date</name> 
    <type>DateTime</type> 
    </Row> 
<Row> 
    <value>0</value> 
    <name>assumed_fuel_ratio</name> 
    <type>int</type> 
    </Row> 
<Row> 
<value> 
    <year_one>Cold</year_one> 
    <year_two>Average</year_two> 
    <year_three>Warm</year_three> 
    </value> 
    <name>weather_variable</name> 
    <type>string</type> 
    </Row> 
    </root> 

Где json находится вход JSON на ваш вопрос, это близко к тому, что вы хотите (что ваш пост говорит, вроде все в порядке), но если вы хотите пойти для 1-го и 2-го вариантов, вы можете просто создайте новый XML, манипулируя этим (переименование узлов и т. д.).

+1

Хм .. Я думаю, что это может сработать :) спасибо! Я помню, как пробовал это немного назад, но он, похоже, не работал ... Возможно, я раньше делал что-то неправильно. –

+0

С удовольствием. Удачи! – Tyress

Смежные вопросы