从 JObject 创建 IronPython 字典

Create IronPython dictionary from JObject

我正在尝试为 IronPython 的脚本范围设置一个变量。我想将 JObject 用作 Python 字典。这是我试过的。

ScriptScope scope = engine.CreateScope();

JObject childObject = new JObject();
childObject["child1"] = "test";
JObject dataObject = new JObject();
dataObject["key1"] = childObject;

scope.SetVariable("metaData", dataObject);

我可以使用metaData变量,也可以通过调用metaData["key1"]来使用第一个键。但是,当我尝试通过调用 metaData["key1"]["child1"] 获取下一个值时,我收到以下错误消息: Can not convert from System.String to System.Object. 如何使用我的 JSON 对象,就好像它是一个普通的 Python字典?我的 JSON 对象的深度会有所不同,因此我需要灵活应对。

对我来说很好。

var engine = Python.CreateEngine();
dynamic scope = engine.CreateScope();
scope.metaData = new JObject
{
    ["key1"] = new JObject
    {
        ["child1"] = "test",
    },
};
engine.Execute(@"
print metaData['key1']['child1']
foo = metaData['key1']
foo['bar'] = 'baz'
print metaData
", scope);

打印:

test
{ 
  "key1": { 
    "child1": "test", 
    "bar": "baz" 
  } 
}

这取决于您在脚本中对对象执行的操作。

请注意,在幕后,它仍然是一个普通的旧 json.net JObject,您无法为其增加任何价值。例如,您不能添加 IronPython dict。它必须是可以或隐式转换为 JToken.

的东西