NET并将@Sign-in XML替换为JSON会话
JSON.NET框架可以将XML转换为JSON,但它使用JSON中的@符号作为属性。我宁愿在将其发送到视图之前删除它。最好的方法是什么 我知道我可以直接替换,但是@字符可能与某个地方有关,不应该被替换。这个有正则表达式吗NET并将@Sign-in XML替换为JSON会话,xml,json,json.net,Xml,Json,Json.net,JSON.NET框架可以将XML转换为JSON,但它使用JSON中的@符号作为属性。我宁愿在将其发送到视图之前删除它。最好的方法是什么 我知道我可以直接替换,但是@字符可能与某个地方有关,不应该被替换。这个有正则表达式吗 public ActionResult布局() { var xml=新的XmlDocument(); xml.xmlsolver=null; Load(Server.MapPath(“~/App_Data/Navigation.xml”); 返回内容(JsonConvert.S
public ActionResult布局()
{
var xml=新的XmlDocument();
xml.xmlsolver=null;
Load(Server.MapPath(“~/App_Data/Navigation.xml”);
返回内容(JsonConvert.SerializeXmlNode(xml,Newtonsoft.Json.Formatting.Indented));
}
{
“布局”:{
“导航”:[
{
“@Type”:“菜单”,
“@Title”:“仪表板”
},
{
“@Type”:“菜单”,
“@Route”:“事件”,
“@Title”:“事件”,
“导航”:{
“@Type”:“Action”,
“@Route”:“事件”,
“@Title”:“+添加事件”,
“@Order”:“1”,
“导航”:{
“@Type”:“Item”,
“@Route”:“事件”,
“@Name”:“事件”,
“导航”:[
{
“@Route”:“Pools”,
“@Type”:“次导航”,
“@Name”:“池”
},
{
“@Route”:“括号”,
“@Type”:“次导航”,
“@Name”:“括号”
}
]
}
}
}
]
}
}
我继续使用这个。如果有更好的办法,请告诉我
public ActionResult布局()
{
var xml=新的XmlDocument();
xml.xmlsolver=null;
Load(Server.MapPath(“~/App_Data/Navigation.xml”);
var jsonText=JsonConvert.SerializeXmlNode(xml,Newtonsoft.Json.Formatting.Indented);
返回内容(Regex.Replace(jsonText),(?正则表达式并不总是工作得很好,当内容具有@字符时,首先,它也将被替换。
因此我认为(?可能更好。另一种选择是创建您自己的单向XMLNodeConverter
继承自JsonConverter
并调用SerializeObject
,而不是像这样调用SerializeXmlNode
:
var json = JsonConvert.SerializeObject(xmlNode, new OneWayXmlNodeConverter());
我之所以称之为“单向”,是因为我假设默认的XmlNodeConverter
添加了“@”符号,这样它就可以从生成的JSON转换回XML
如果在项目中包含JSON.NET
源代码(而不仅仅是编译的库),那么创建OneWayXmlNodeConverter
的简单方法是复制XmlNodeConverter
代码,删除硬编码的“@登录私有的GetPropertyName
方法,并将其另存为OneWayXmlNodeConverter
注意:我知道您的问题是针对“@”符号的“替换”,但此问题的链接变体被标记为重复。我建议使用以下正则表达式,它与提供的@yieio相同,但增强以保持内容不变,不做任何修改,并且只影响属性名称
var jString = Regex.Replace(
JsonConvert.SerializeXmlNode(content, Newtonsoft.Json.Formatting.None, true),
"(?<=(\\,\\\"|\\{\\\"))(@)(?!.*\\\":\\\\s )", String.Empty, System.Text.RegularExpressions.RegexOptions.IgnoreCase);
var jString=Regex.Replace(
SerializeXmlNode(内容,Newtonsoft.Json.Formatting.None,true),
(?如果由于“@”符号而要访问属性的值,请执行以下操作:
Navigation["@Type"]
这一回应已经有一段时间了,但这仍然可能对某些人有所帮助。
因为您已经有了XMLDocument,所以可以在序列化它之前删除和转换属性
public static void RemoveAllAttributes(XmlDocument xmlDocument)
{
if (xmlDocument == null || !xmlDocument.HasChildNodes) return;
foreach (var xmlElement in xmlDocument.SelectNodes(".//*").Cast<XmlElement>().Where(xmlElement => xmlElement.HasAttributes))
{
xmlElement.Attributes.RemoveAll();
}
}
public static void ElementifyAllAttributes(XmlDocument xmlDocument)
{
if (xmlDocument == null || !xmlDocument.HasChildNodes) return;
foreach (var xmlElement in xmlDocument.SelectNodes(".//*").Cast<XmlElement>().Where(xmlElement => xmlElement.HasAttributes))
{
foreach (XmlAttribute xmlAttribute in xmlElement.Attributes)
{
xmlElement.AppendChild(xmlDocument.CreateElement(xmlAttribute.Name)).InnerText = xmlAttribute.Value;
}
xmlElement.Attributes.RemoveAll();
}
}
如果JSON缩进,这可能会起作用:
Regex.Replace(result, @"(\s*)""@(.*)"":", @"$1""$2"":", RegexOptions.IgnoreCase);
我花了很长时间才找到正确的答案,所以我想与大家分享一下:
var xDocument=xDocument.Parse(“c”);
var builder=新的StringBuilder();
JsonSerializer.Create().Serialize(新的CustomJsonWriter(新的StringWriter(builder)),xDocument);
var serialized=builder.ToString();
公共类CustomJsonWriter:JsonTextWriter
{
公共CustomJsonWriter(TextWriter编写器):基本(编写器){}
公共重写无效WritePropertyName(字符串名称)
{
if(name.StartsWith(“@”)| name.StartsWith(“#”)
{
base.WritePropertyName(name.Substring(1));
}
其他的
{
base.WritePropertyName(名称);
}
}
}
输出:
{“xml”:{“a”:{“attr”:“b”,“text”:“c”}
首先将xml内容中的所有“@”替换为某个占位符(例如{{at the_rate}})
JsonConvert.SerializeXmlNode(doc).Replace("@", "").Replace("{{at_the_rate}}", "@")
这是我的正则表达式贡献,使用lookaheads和lookbehinds确保它只出现在属性字段中
(?m)(?如果您知道这是@signs在json中显示的唯一位置,string.replace的工作速度更快或更大,正如@yieio所提到的,这对于以@
开头的值仍然不起作用,例如,
将导致{“test”:{“attr”:“foo”}
。这对性能不好。最好创建一个自定义JsonTextWriter,如此处其他地方所述。这对于以开头的值仍然不起作用。”@
,例如,@Aristoteles检查我的正则表达式,它基于上述内容,但不修改内容正则表达式方法对性能不好,并且可能存在错误。您的建议很有趣,但您尝试过吗?当我尝试复制XmlNodeConverter代码时,我发现它严重依赖于内部接口和类,因此我没能按照你的建议去做。你成功地让它工作了吗?@polaeward我在我的项目中包含了Json.Net源代码,所以我能够使用内部代码。我会更新我的答案,因为你是对的,如果你只是使用库,就不那么容易了:-)太好了,总是建议更新答案:)事实上,我最终意识到我必须嵌入newtonsoft代码才能编辑它,坚持使用特定版本并丢失作者未来的所有更新,或者使用regex,我决定使用regex当我尝试使用它时,它没有
JsonConvert.SerializeXmlNode(doc).Replace("@", "").Replace("{{at_the_rate}}", "@")