gpt4 book ai didi

c# - 在转换为 XML 之前更改 JSON 对象中的属性名称

转载 作者:太空宇宙 更新时间:2023-11-03 23:14:09 26 4
gpt4 key购买 nike

我正在尝试将一些 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 是只读的。

有人知道如何实现这个解决方案吗?

最佳答案

由于属性名称是只读的,您需要替换整个属性。您可以使用 Replace 方法来执行此操作:

        if (Regex.IsMatch(jp.Name, @"^\d"))
{
string name = "n" + jp.Name;
jp.Replace(new JProperty(name, jp.Value));
}

但是,这会导致另一个问题——因为您在迭代时试图修改 JObjectProperties 集合,Json.Net 将抛出一个InvalidOperationException。要解决这个问题,您必须将属性复制到一个单独的列表并对其进行迭代。您可以在 foreach 中使用 ToList() 方法,如下所示:

    foreach (JProperty jp in jo.Properties().ToList())

最后,要将更新的 JObject 转换回 JSON,只需使用 ToString()。 将它们放在一起我们有:

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();
}

fiddle :https://dotnetfiddle.net/rX4Jyy


上述方法只会处理一个简单的 JSON 对象,其属性都在一个级别上。您在评论中指出您的实际 JSON 不是平面的,而是分层的。为了替换层次结构中的所有数字属性名称,您需要使方法递归,如下所示:

public static string ChangeNumericalPropertyNames(JsonReader reader)
{
JObject jo = JObject.Load(reader);
ChangeNumericalPropertyNames(jo);
return jo.ToString();
}

public static void ChangeNumericalPropertyNames(JObject jo)
{
foreach (JProperty jp in jo.Properties().ToList())
{
if (jp.Value.Type == JTokenType.Object)
{
ChangeNumericalPropertyNames((JObject)jp.Value);
}
else if (jp.Value.Type == JTokenType.Array)
{
foreach (JToken child in jp.Value)
{
if (child.Type == JTokenType.Object)
{
ChangeNumericalPropertyNames((JObject)child);
}
}
}

if (Regex.IsMatch(jp.Name, @"^\d"))
{
string name = "n" + jp.Name;
jp.Replace(new JProperty(name, jp.Value));
}
}
}

fiddle :https://dotnetfiddle.net/qeZK1C

关于c# - 在转换为 XML 之前更改 JSON 对象中的属性名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37860882/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com