c# - 从 XML 转换为 JSON 时更改属性值

标签 c# json.net

在一个项目中,我使用 TSQL FOR XML 从数据库中获取一些数据。在所有表中,日期字段的最小值设置为 01/01/1900

那是因为不允许将 null 值作为无法更改的内部策略。

对于 xml 结果,我需要将其转换为 JSON 并将其序列化到客户端。

为此我使用:

string jSonString = Newtonsoft.Json.JsonConvert.SerializeXmlNode(xmlDoc, Newtonsoft.Json.Formatting.None, true);

很好;现在我需要在转换为 JSON 时将每个 01/01/1900 日期转换为 DateTime.MinValue (01/01/0001);我该如何处理?

最佳答案

更新 - 修改代码以适用于具有值 01/01/1900 的任何节点/属性。

我会在转换为 JSON 之前处理 XML 文档。这是 LinqPad 示例,说明如果您的日期值是节点或属性值,如何执行此操作。因为我不知道你的 XML 数据结构,简单的例子:

void Main()
{
    // IF IT IS NODE VALUE
    var xml = @"<data>
        <objectA>
            <dateValueA>01/01/1900</dateValueA>
            <dateValueB>01/01/1971</dateValueB>
        </objectA>
        <objectB>
            <dateValueA>01/01/2002</dateValueA>
            <dateValueB>01/01/1900</dateValueB>
            <dateValueZ>01/01/2011</dateValueZ>
        </objectB>
        <objectC>
            <dateValueA>01/01/1910</dateValueA>
            <dateValueB>01/01/2012</dateValueB>
            <dateValueC>01/01/1900</dateValueC>
        </objectC>
    </data>";

    var xmlDoc = new XmlDocument();
    xmlDoc.LoadXml(xml);

    var nodes = xmlDoc.SelectNodes("//*[text()='01/01/1900']");
    foreach(XmlNode node in nodes)
    {
        node.InnerText = "01/01/0001";
    }

    string jSonString = Newtonsoft.Json.JsonConvert.SerializeXmlNode(xmlDoc, Newtonsoft.Json.Formatting.None, true);

    "// IF IT IS NODE VALUE - RESULTS".Dump();
    jSonString.Dump();

    // IF IT IS ATTRIBUTE VALUE
    var xmlAttr = @"<data>
        <objectA dateValueA='01/01/1900' dateValueB='01/01/1900' dateValueC='01/01/2011' />
        <objectB dateValueB='01/01/2011' someOtherDate='01/01/1900' />
        <objectC dateValueC='01/01/1900' dontChangeThisDate='05/04/1923' />
    </data>";

    var xmlDocAttr = new XmlDocument();
    xmlDoc.LoadXml(xmlAttr);

    var nodesAttr = xmlDoc.SelectNodes("//*[@*='01/01/1900']");
    for(var i=0; i < nodesAttr.Count; i++)
    {
        foreach(XmlAttribute attrib in nodesAttr[i].Attributes)
        {
            if (attrib.Value == "01/01/1900")
            {
                attrib.Value = "01/01/0001";
            }
        }
    }

    string jSonStringAttr = Newtonsoft.Json.JsonConvert.SerializeXmlNode(xmlDoc, Newtonsoft.Json.Formatting.None, true);

    "// IF IT IS ATTRIBUTE VALUE - RESULTS".Dump();
    jSonStringAttr.Dump();

}

和结果:

// IF IT IS NODE VALUE - RESULTS
{"objectA":{"dateValueA":"01/01/0001","dateValueB":"01/01/1971"},"objectB":{"dateValueA":"01/01/2002","dateValueB":"01/01/0001","dateValueZ":"01/01/2011"},"objectC":{"dateValueA":"01/01/1910","dateValueB":"01/01/2012","dateValueC":"01/01/0001"}}

// IF IT IS ATTRIBUTE VALUE - RESULTS
{"objectA":{"@dateValueA":"01/01/0001","@dateValueB":"01/01/0001","@dateValueC":"01/01/2011"},"objectB":{"@dateValueB":"01/01/2011","@someOtherDate":"01/01/0001"},"objectC":{"@dateValueC":"01/01/0001","@dontChangeThisDate":"05/04/1923"}}

这对你有用吗?

关于c# - 从 XML 转换为 JSON 时更改属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30239402/

相关文章:

c# - 在 C# 中从 MySql 获取两个日期之间的数据

c# - 我将如何同步运行异步 Task<T> 方法?

c# - "Invalid cast from ' 日期时间 ' to ' Int64'。反序列化 JSON 字符串时

c# - 如何在反序列化期间以编程方式选择构造函数?

java - 当JSON包含Json.Net C#生成的$ref和$id时,如何在Java中反序列化

c# - Json.Net DeserializeObject 因 OData.Delta 而失败 - 仅限整数

c# - Json.NET:反序列化嵌套字典

c# - 检测屏幕键盘是否打开

c# - 学习创建 Windows MCE 插件

c# - 在 WPF 应用程序中使用 C# 确定位图中像素的颜色