Json.NET 6.0 Release 3 的 release notes 状态
但这不是我的经验。
var xmlText = @"<document xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" Version=""1.1"">
<empty/>
<space> </space>
<null xsi:nil=""true""/>
</document>";
var doc = new XmlDocument();
doc.LoadXml(xmlText);
var jsonText = JsonConvert.SerializeXmlNode(doc);
我期望
"empty":"", "space":" ", "null":{"@xsi:nil":"true"}
但得到
"empty":null, "space":"", "null":{"@xsi:nil":"true"}
丢失的空间现在不是问题,但我真的很喜欢将空的 XML 元素序列化为 ""而不是 null。这可能吗?
最佳答案
如果您按以下格式编写 xml,您将获得所需内容:
var xmlText = @"<document xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" Version=""1.1"">
<empty></empty>
<space> </space>
<null xsi:nil=""true""/>
</document>";
正如您所注意到的,您想要序列化为空字符串的节点被写为
<empty></empty>
而不是 <empty />
。问题是 JSON.NET,为了将 xml 节点序列化为 json,使用
XmlNodeConverter
类,该类在其 SerializeNode
方法中检查 IsEmpty
类的 XmlElement
属性。您可以阅读有关此属性的更多信息 here 。上面提到的决定是序列化 null
还是空字符串的方法的代码段如下所示:if (element.IsEmpty)
writer.WriteNull();
else
writer.WriteValue(string.Empty);
当xml片段自闭合(
<empty/>
)时, IsEmpty
属性返回true,并在json字符串中写入null,否则( <empty></empty>
)返回false,并将string.empty写入json字符串中。更新 1:
此更新应解决 here 所描述的问题。 (该链接也可在此答案的评论中找到)。
为了能够将没有值的属性序列化为
<empty></empty>
而不是 <empty/>
,我们应该执行自定义 xml 序列化,因此 Serializetest
类(在上面的链接中可用)应该如下所示:[Serializable]
public class Serializetest : IXmlSerializable
{
public Serializetest()
{
Empty = string.Empty;
}
public string Empty { get; set; }
public XmlSchema GetSchema()
{
return null;
}
public void ReadXml(XmlReader reader)
{
throw new NotImplementedException();
}
public void WriteXml(XmlWriter writer)
{
writer.WriteStartElement("Empty");
writer.WriteValue(Empty);
writer.WriteEndElement();
}
}
然后是主要方法:
var serializetest = new Serializetest();
string xmlText;
var serializer = new XmlSerializer(typeof(Serializetest));
using (var textWriter = new StringWriter())
{
using (var xmlWriter = XmlWriter.Create(textWriter))
{
serializer.Serialize(xmlWriter, serializetest);
}
xmlText = textWriter.ToString();
}
var doc = new XmlDocument();
doc.LoadXml(xmlText);
var jsonText = JsonConvert.SerializeXmlNode(doc);
var json = JObject.Parse(jsonText);
var empty = (string)json.SelectToken("Serializetest.Empty");
// This should return empty string instead of null.
关于c# - 如何让 Json.NET 将空 XML 元素序列化为空字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24368006/