JSON.NET和替换@登录XML到JSON转换

Mik*_*ynn 11 xml json json.net

JSON.NET框架可以将XML转换为JSON,但它使用JSON中的@符号作为属性.我希望在将它发送到视图之前删除它.对此最好的方法是什么?

我知道我可以直接替换,但@字符在某处可能是相关的,不应该被替换.这有正则表达式吗?

public ActionResult Layout()
{
    var xml = new XmlDocument();
    xml.XmlResolver = null;
    xml.Load(Server.MapPath("~/App_Data/Navigation.xml"));
    return Content(JsonConvert.SerializeXmlNode(xml, Newtonsoft.Json.Formatting.Indented));
}
Run Code Online (Sandbox Code Playgroud)
{
  "Layout": {
    "Navigation": [
      {
        "@Type": "Menu",
        "@Title": "Dashboard"
      },
      {
        "@Type": "Menu",
        "@Route": "Events",
        "@Title": "Events",
        "Navigation": {
          "@Type": "Action",
          "@Route": "Event",
          "@Title": "+ Add Event",
          "@Order": "1",
          "Navigation": {
            "@Type": "Item",
            "@Route": "Event",
            "@Name": "Event",
            "Navigation": [
              {
                "@Route": "Pools",
                "@Type": "SubNavigation",
                "@Name": "Pools"
              },
              {
                "@Route": "Brackets",
                "@Type": "SubNavigation",
                "@Name": "Brackets"
              }
            ]
          }
        }
      }
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

Ily*_*lya 19

我花了很长时间才找到正确的答案,所以我想我会分享:

var xDocument = XDocument.Parse("<xml><a attr=\"b\">c</a></xml>");
var builder = new StringBuilder();
JsonSerializer.Create().Serialize(new CustomJsonWriter(new StringWriter(builder)), xDocument);
var serialized = builder.ToString();

public class CustomJsonWriter : JsonTextWriter
{
    public CustomJsonWriter(TextWriter writer): base(writer){}

    public override void WritePropertyName(string name)
    {
        if (name.StartsWith("@") || name.StartsWith("#"))
        {
            base.WritePropertyName(name.Substring(1));
        }
        else
        {
            base.WritePropertyName(name);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

{"xml":{"a":{"attr":"b","text":"c"}}}
Run Code Online (Sandbox Code Playgroud)


Mik*_*ynn 9

我继续使用它.如果有更好的方法,请告诉我.

public ActionResult Layout()
{
    var xml = new XmlDocument();
    xml.XmlResolver = null;
    xml.Load(Server.MapPath("~/App_Data/Navigation.xml"));

    var jsonText = JsonConvert.SerializeXmlNode(xml, Newtonsoft.Json.Formatting.Indented);
    return Content(Regex.Replace(jsonText, "(?<=\")(@)(?!.*\":\\s )", string.Empty, RegexOptions.IgnoreCase));
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您知道这是@符号将显示在json,string.replace中的唯一位置,则它的工作速度更快或文档更大 (2认同)