在一个项目中,我使用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
。