使用newtonsoft.json.jsonserializer将JSON转换为Xdocument



我能够使用默认实现进行从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();

相关内容

  • 没有找到相关文章

最新更新