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

  • 本文关键字:属性 JSON XML 转换 c# json.net
  • 更新时间 :
  • 英文 :


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

那是因为不允许零值作为无法更改的内部政治。

使用XML结果,我需要将其转换为JSON并将其序列化为客户端。

这样做我正在使用:

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

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

update - 修改了具有值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"}}

这对您有用吗?

如果您控制了T-SQL,则可以尝试更换查询中的值:

CASE   
    WHEN [DateWhichCantBeNull] = '1900-01-01'
        THEN '0001-01-01'
    ELSE [DateWhichCantBeNull]
END AS "DateWhichCantBeNull"

如果仍然需要正确工作的实际日期,则可能需要将其作为DateTime2

相关内容

  • 没有找到相关文章

最新更新