c# - Json.net 重命名属性

标签 c# .net json json.net rename

我有一个表示 JSON 的字符串,我想使用 JSON.NET 重命名一些属性。我需要一个通用函数来用于任何 JSON。像这样的东西:

public static void Rename(JContainer container, Dictiontionary<string, string> mapping)
{
  foreach (JToken el in container.Children())
  {
    JProperty p = el as JProperty;
    if(el != null && mapping.ContainsKey(p.Name))
    {
      // **RENAME THIS NODE!!**
    }

    // recursively rename nodes
    JContainer pcont = el as JContainer;
    if(pcont != null)
    {
      Rename(pcont, mapping);
    }
  }
}

怎么做??

最佳答案

我建议使用重命名的属性重建您的 JSON。我认为您不必担心速度惩罚,因为这通常不是问题。以下是您的操作方法。

public static JToken Rename(JToken json, Dictionary<string, string> map)
{
    return Rename(json, name => map.ContainsKey(name) ? map[name] : name);
}

public static JToken Rename(JToken json, Func<string, string> map)
{
    JProperty prop = json as JProperty;
    if (prop != null) 
    {
        return new JProperty(map(prop.Name), Rename(prop.Value, map));
    }

    JArray arr = json as JArray;
    if (arr != null)
    {
        var cont = arr.Select(el => Rename(el, map));
        return new JArray(cont);
    }

    JObject o = json as JObject;
    if (o != null)
    {
        var cont = o.Properties().Select(el => Rename(el, map));
        return new JObject(cont);
    }

    return json;
}

这是一个用法示例:

var s = @"{ ""A"": { ""B"": 1, ""Test"": ""123"", ""C"": { ""Test"": [ ""1"", ""2"", ""3"" ] } } }";
var json = JObject.Parse(s);

var renamed = Rename(json, name => name == "Test" ? "TestRenamed" : name);
renamed.ToString().Dump();  // LINQPad output

var dict = new Dictionary<string, string> { { "Test", "TestRenamed"} };
var renamedDict = Rename(json, dict);
renamedDict.ToString().Dump();  // LINQPad output

关于c# - Json.net 重命名属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11679804/

相关文章:

c# - 使用 html 编码或转义字符加载 XML 或 XHTML 内容

java - 我们可以在 Drools 中动态设置事实类型和事实字段吗

c# - 无法使用 Server.MapPath

c# - 使用 ASP.NET Core 的应用程序和用户身份验证

c# - SAFE Pointer to a pointer (well reference to a reference) 在 C# 中

c# - 强类型属性声明 - 这段代码安全吗?

javascript - 语法 :Error JSON. 解析,尝试为 protovis 加载数据时

json - Youtube 无 key API 通过 id 检索视频信息

c# - WPF - 具有自定义 DefaultStyleKey 的自定义窗口丢失 FocusVisualStyle

c# - 使用 JavaScript 更改页面状态,回发时会调用旧状态