C# 使用C将名称空间前置到动态JSON对象键#

C# 使用C将名称空间前置到动态JSON对象键#,c#,json,.net,namespaces,prefix,C#,Json,.net,Namespaces,Prefix,我有一个业务案例,需要获取任何传入的JSON负载(因此JSON对象必须是动态的,而不是由C#类预定义的),并将给定的名称空间前置到它的所有包含键 例如,如果出现以下有效负载: { "property1": "value1", "property2": 2, "property3": true, "property4": { "myArray": [

我有一个业务案例,需要获取任何传入的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):

您可以使用Json.Net的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();
}

此处的工作演示:

如果使用,可以使用
PropertyNameMappingJsonReader
from-to添加名称空间前缀。然后使用该读取器反序列化到
JToken
,或直接流式传输到输出
StringWriter
,如至所示。非常感谢Brian!我无法告诉你我有多感激你,你只是帮我省去了几个小时(也许几天)的头痛,想办法解决这个问题;很高兴我能帮忙。
string modifiedJson = AddPrefixToAllKeys(originalJson, "mynamespace.");