【问题标题】:Json.net rename propertiesJson.net 重命名属性
【发布时间】:2012-07-25 15:50:08
【问题描述】:

我有一个表示 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);
    }
  }
}

怎么做??

【问题讨论】:

    标签: c# .net json json.net rename


    【解决方案1】:

    我建议使用重命名的属性重建您的 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
    

    【讨论】:

    • 可能存在一些小错误,但如果您发现任何问题,您可以自行修复:)
    【解决方案2】:

    我们使用这种方法。您可以使用 JObject 的 SelectToken() 找到所需的属性。是的,它确实支持 JsonPath。

    public static class NewtonsoftExtensions
    {
        public static void Rename(this JToken token, string newName)
        {
            var parent = token.Parent;
            if (parent == null)
                throw new InvalidOperationException("The parent is missing.");
            var newToken = new JProperty(newName, token);
            parent.Replace(newToken);
        }
    }
    

    【讨论】:

    • 有点惊讶你没有指出这实际上是框架的一部分,由你登陆:github.com/abibell/Newtonsoft.Json/commit/… :-)
    • 嗨 Alastair,我想要这个功能。我为它做了咖啡更改并发送了一个拉取请求。业主不接受,理由是“我不喜欢”。github.com/JamesNK/Newtonsoft.Json/pull/549
    • @AbiBellamkonda,我正在尝试使用此扩展方法重命名 JProperty 对象,但出现异常“无法将 Newtonsoft.Json.Linq.JProperty 添加到 Newtonsoft.Json.Linq.JProperty 。”从这段代码:new JProperty(newName, token).
    • 嗨 Gyromite,对不起,我想帮忙,但我不能,因为我有一段时间没有关注图书馆了。您可能需要查看该库是否在最近的版本中更改了 JProperty 的创建?
    • 我得到与@Gyromite 相同的错误。此代码不起作用。
    猜你喜欢
    • 1970-01-01
    • 2018-04-26
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多