Json.net 重命名属性 [英] Json.net rename properties

查看:26
本文介绍了Json.net 重命名属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have a string representing JSON and I want to rename some of the properties using JSON.NET. I need a generic function to use for any JSON. Something like:

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.我认为您不应该担心速度处罚,因为这通常不是问题.以下是你可以做到的.

I would suggest reconstructing your JSON with renamed properties. I don't think you should worry about speed penalties as it's usually not an issue. Here's how you can do it.

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

这篇关于Json.net 重命名属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆