我能够使用默认实现进行从JSON到XML的转换,反之亦然。
但是,JSON.NET将XML属性带有@
。只能通过使用root['@myAttribute']
在JavaScript中访问这一点。出于绩效原因,我使用自定义JsonTextWriter
重命名属性,而是用$
将它们列为前缀,以便我可以使用root.$myAttribute
访问它们。
我的自定义JSontextWriter
public class CustomJsonTextWriter : JsonTextWriter
{
public CustomJsonTextWriter(TextWriter writer) : base(writer) { }
public override void WritePropertyName(string propertyName)
{
if (propertyName.StartsWith("@"))
base.WritePropertyName("$" + propertyName.Substring(1));
else
base.WritePropertyName(propertyName);
}
}
用法
public static string ConvertXDocumentToJson(XDocument xDoc)
{
// Usage of the CustomJsonTextWriter to write the XML doc in JSON format prefixing attributes with "$" instead of "@".
var builder = new StringBuilder();
JsonSerializer.Create().Serialize(new CustomJsonTextWriter(new StringWriter(builder)), xDoc);
return builder.ToString();
}
从这一点开始,我能够相当有效地从XML转换,并以所需的JSON格式(属性如图所示)。
问题
问题出现在反向转换上,JSON到XML,因为应该是XML属性的字段(以@
的前缀)仍然有$
的前缀。
我知道有一些方法可以通过使用Regex和string.replace来纠正此问题,但是我不想在进行转换之前再次对整个JSON进行额外的阅读。
首选解决方案
我想拥有一个可以输出XML的CustomJsonTextReader
,但是通过指定前缀char为" $"而不是"@"。我期待某种班级(Jsontextreader)的替代,我可以做类似的事情:
public override void ReadPropertyName(string propertyName)
{
// pseudo-code
if(propertyName.startsWith("$")) // instead of "@"
CreateXmlAttribute(propertyName.substring(1));
}
看起来您需要JsonTextReader
进行反向...
阅读器
public class CustomJsonReader : JsonTextReader
{
public CustomJsonReader(TextReader reader) : base(reader) { }
public override object Value
{
get
{
if (TokenType != JsonToken.PropertyName)
{
return base.Value;
}
var propertyName = base.Value.ToString();
if (propertyName.StartsWith("$"))
{
return $"@{propertyName.Substring(1)}";
}
else
{
return base.Value;
}
}
}
}
用法
var xmlDoc = JsonSerializer.Create().Deserialize<XmlDocument>(
new CustomJsonReader(new StringReader(json)));
// get the string value if needed...
var builder = new StringBuilder();
xmlDoc.Save(new StringWriter(builder ));
var xml = outbuilder.ToString();