如何通过将变量名作为值传递给 json 配置文件 (C#) 中的键来在动态对象中插入变量名?

问题描述 投票:0回答:1

MRE('导致许可问题) 我在 C# 中有一个动态对象(它主要用于反序列化 json 字符串):

dynamic jsonObj = JsonConvert.Deserialize(<theJsonString>);

然后,我将需要设置的 json 的所有键都放入一个配置文件中。是的,我知道手动设置 Json 总是更好,但是这个项目的要求是使用 REST API 传递要设置的键和它们各自的值。:
dynamic confKeys = <DeserializedObject>

一个好处是
confKeys
对象中的键位于它们的完整访问路径中。因此,对于
{["keyOuter":{"keyInner":"valueInner"}]}
类型的键,
confKeys
将字符串“jsonObj[0].keyOuter.keyInner”作为键。
这是我想做的事情的概念表示:
configuration[0].name as a variable being accessed = configuration[0].value as another variable being accessed
.


MRE 配置文件的结构(外部的,即保存键及其要插入的值的那个):

{[
  "jsonObj[0].keyOuter.keyInner": "someValue",
  "jsonObj[2].keyLaLa": "someValueLaLa"
]}

本质上,我的配置文件包含指向另一个 json 文件对象键的指针...
PS:有什么办法可以取消对用户将最外面的对象称为

jsonObj
的限制吗?


编辑:尽我所能澄清:
之前
示例 json 文件:

{
  "someOuterKey.someInnerKey.someEvenMoreInnerKey": "someValue"
}

另一个相关的示例 json 文件:

{
  "someOuterKey": {
    "someInnerKey": {
      "someEvenMoreInnerKey": "someCurrentValue"
    }
  }
}

之后
示例 json 文件:

{
  "someOuterKey.someInnerKey.someEvenMoreInnerKey": "someValue"
}

另一个相关的示例 json 文件:

{
  "someOuterKey": {
    "someInnerKey": {
      "someEvenMoreInnerKey": "someValue"
    }
  }
}

目前已经能够反序列化这两个 json(使用

dynamic objects
)但是找不到将 json1 中的键转换为访问 json2 的变量的方法。


c# json
1个回答
0
投票
Newtonsoft Json.NET 中的

AFAIK 动态反序列化内部使用了

JToken
的,因此您可以直接使用它们。例如通过
SelectToken(s)
:

使用 JSON 路径语法
var js1 = """
{
    "someOuterKey.someInnerKey.someEvenMoreInnerKey": "someValue"
}
""";
var js2 = """
{
    "someOuterKey": {
        "someInnerKey": {
            "someEvenMoreInnerKey": "someCurrentValue"
        }
    }
}
""";
var o1 = JsonConvert.DeserializeObject<JObject>(js1);
var o2 = JsonConvert.DeserializeObject<JObject>(js2);
foreach (var kvp in o1)
{
    var value = kvp.Value.Value<string>();
    var selectToken = o2.SelectToken(kvp.Key);
    if (selectToken is not null)
    {
        selectToken.Replace(kvp.Value);
    }
}

var serializeObject = JsonConvert.SerializeObject(o2); // {"someOuterKey":{"someInnerKey":{"someEvenMoreInnerKey":"someValue"}}}
© www.soinside.com 2019 - 2024. All rights reserved.