C# 动态将 JSON 对象转换为 XML

标签 c# json xml

我正在尝试将从 Web 浏览器客户端发送到服务器的 JSON 进行转换,以便可以将数据作为 XML 形式的参数发送到 SQL 数据库。我正在努力做到这一点,因为我在对象内部有对象,并且我不确定如何将它们动态转换为结构化 XML 格式。下面是我正在使用的 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>

C# 代码:

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;
        }
    }
}

过滤器.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();
        }
    }
}

最佳答案

不是基于您当前的代码构建的,您可以查看 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,它接近您想要的(您的帖子说这是可以的),但如果您想选择第一个和第二个选项,您可以通过操作它(重命名节点等)来简单地构建新的 XML。

关于C# 动态将 JSON 对象转换为 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35406894/

相关文章:

javascript - d3.js:如何遍历备份 DOM

php - 实际有值时sql语句返回null

asp.net - x 位数且只有一个连字符的正则表达式?

xml - 在 DTD 模式中声明多个规则

c# - Queue.Count 线程安全吗?

c# - Windows Phone 7 Mango (7.1) - 不重复调用后台任务

jquery - 如何压缩json文件

c# - StreamReader 和 TextReader

c# - 当对象为空时 Linq to 对象 VS Linq to SQL

c# - XmlReader 和 MemoryStream,返回的 xml 缺少标签