【问题标题】:Prepend namespace to dynamic JSON objects keys using C#使用 C# 将命名空间添加到动态 JSON 对象键
【发布时间】:2021-06-26 18:24:45
【问题描述】:

我有一个业务案例,我需要获取任何传入的 JSON 有效负载(因此 JSON 对象必须是动态的,而不是由 C# 类预定义的)并将给定的命名空间添加到其所有包含的键。

例如,如果以下有效负载进入:

{
  "property1": "value1",
  "property2": 2,
  "property3": true,
  "property4": {
    "myArray": [
      {
        "arrayProperty1": "im the first object in array",
        "arrayProperty2": "some value"
      },
      {
        "arrayProperty1": "im the second object in array",
        "arrayProperty2": "some value"
      }
    ]
  }
}

那么它需要产生如下输出:

{
  "mynamespace.property1": "value1",
  "mynamespace.property2": 2,
  "mynamespace.property3": true,
  "mynamespace.subObj": {
    "mynamespace.myArray": [
      {
        "mynamespace.arrayProperty1": "im the first object in array",
        "mynamespace.arrayProperty2": "some value"
      },
      {
        "mynamespace.arrayProperty1": "im the second object in array",
        "mynamespace.arrayProperty2": "some value"
      }
    ]
  }
}

这可能使用 C# 吗?我尝试在 stackoverflow 上搜索任何类似的问题,但这是我得到的最接近的问题(他们使用的是 javascript):Prepending namespace to all of a JSON object's Keys

【问题讨论】:

标签: c# json .net namespaces prefix


【解决方案1】:

您可以使用 Json.Net 的 LINQ-to-JSON API (JTokens) 创建一个简短的辅助方法来完成此操作:

public static string AddPrefixToAllKeys(string json, string prefix)
{
    JContainer token = (JContainer)JToken.Parse(json);

    // Note: We need to process the descendants in reverse order here
    // to ensure we replace child properties before their respective parents
    foreach (JProperty prop in token.Descendants().OfType<JProperty>().Reverse().ToList())
    {
        prop.Replace(new JProperty(prefix + prop.Name, prop.Value));
    }
    
    return token.ToString();
}

然后像这样使用它:

string modifiedJson = AddPrefixToAllKeys(originalJson, "mynamespace.");

这里的工作演示:https://dotnetfiddle.net/AdkAO7

【讨论】:

  • 非常感谢布赖恩!无法告诉你我有多感激,你只是让我省了几个小时(或几天)的头痛试图弄清楚这一点。
  • 没问题;很高兴我能帮上忙。
猜你喜欢
  • 2013-06-16
  • 2011-03-06
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
相关资源
最近更新 更多