我正在尝试将一些JSON转换为XML,但在此之前我需要更改一些属性才能成功转换。
JSON结构中的某些属性以数字开头,当我尝试转换为XML时,我收到错误,因为XML不允许以数字开头的标记。
因此,一个适合我的解决方案是通过向属性添加前缀来更改以数字开头的属性名称。
我一直在努力做这样的事情:
public string ChangeNumericalPropertyNames(JsonReader reader)
{
JObject jo = JObject.Load(reader);
foreach (JProperty jp in jo.Properties())
{
if (Regex.IsMatch(jp.Name, @"^\d"))
{
string name = "n" + jp.Name;
//Logic to set changed name
}
}
return "Here I want to return the entire json string with changed names";
}
当我尝试这个时:
jp.Name = name;
Visual Studio说这是不可能的,因为jp.Name
是只读的。
有人知道如何实现这个解决方案吗?
答案 0 :(得分:2)
由于属性名称是只读的,因此您需要替换整个属性。您可以使用Replace
方法执行此操作:
if (Regex.IsMatch(jp.Name, @"^\d"))
{
string name = "n" + jp.Name;
jp.Replace(new JProperty(name, jp.Value));
}
但是,这会导致另一个问题 - 因为您在迭代它时尝试修改Properties
的{{1}}集合,Json.Net将抛出JObject
。要解决此问题,您必须将属性复制到单独的列表中,然后对其进行迭代。您可以使用InvalidOperationException
中的ToList()
方法执行此操作,如下所示:
foreach
最后,要将更新的 foreach (JProperty jp in jo.Properties().ToList())
转换回JSON,只需使用JObject
将所有内容放在一起我们就有:
ToString().
小提琴:https://dotnetfiddle.net/rX4Jyy
上述方法只处理一个级别上具有属性的简单JSON对象。您在评论中指出您的实际JSON不是平坦的,而是分层的。为了替换层次结构中的所有数字属性名称,您需要使您的方法递归,如下所示:
public static string ChangeNumericalPropertyNames(JsonReader reader)
{
JObject jo = JObject.Load(reader);
foreach (JProperty jp in jo.Properties().ToList())
{
if (Regex.IsMatch(jp.Name, @"^\d"))
{
string name = "n" + jp.Name;
jp.Replace(new JProperty(name, jp.Value));
}
}
return jo.ToString();
}