【问题标题】:How to set a dynamic expression name at runtime (JSON Parser)如何在运行时设置动态表达式名称(JSON Parser)
【发布时间】:2012-07-30 06:30:41
【问题描述】:

我正在构建一个 JSON 文件解析器。我目前使用 JavaScriptSerializer 类将 JSON 文件读入一个 DynamicJsonObject,看起来像

dynamic glossaryEntry

然后我可以通过以下方式检索顶级 json 节点。用于检索这个名为 Scoring 的 JSON 组,看起来像

{
    "Scoring":
    [
        {
            "blah": "blah",
            "blah": "blah"      
        },
        {
            "blah": "blah",
            "blah": "blah"      
        }   
    ]
}

我使用动态表达式:

return glossaryEntry.Scoring;

或者例如我会使用

return glossaryEntry.quests;

对于看起来像这样的 JSON:

{
    "quests":
    [
        ... 
    ]
}

这是非常硬编码的,需要我提前知道可以解析的所有可能的标识符。我在想必须有一种方法可以让动态表达式评估为某些东西,以便可以在运行时确定词汇表条目。“this”部分?

感谢您提供的任何帮助。

【问题讨论】:

    标签: c# json dynamic javascriptserializer


    【解决方案1】:

    您可以将您的 json 字符串反序列化为 Dictionary<string,object>

    var glossaryEntry = new JavaScriptSerializer().Deserialize<Dictionary<string, object>>(json);
    var keys = glossaryEntry.Keys.ToList();
    
    var scoring1 = glossaryEntry["Scoring"];
    //OR
    var scoring2 = glossaryEntry[keys[0]];
    

    【讨论】:

    • 我可能遗漏了一些东西,但问题是动态对象将始终使用变量名而不是它的值...所以返回glossaryEntry.scoring2 仍将搜索值“scoring2”而不是键值[0]?
    • 你应该像这样使用glossaryEntry[keys[0]]glossaryEntry["quests"]
    • 你是对的,我实际上不得不单独留下词汇表实体,只返回scoring1 或scoring2 变量给我的值与glossaryEntry.quests 给出的值相同。极好的。非常感谢! (有效的代码实际上是您所做的修改之前的代码,即 var score1 = dict[keys[0]]
    • (有效的代码实际上是您所做修改之前的代码,即 var score1 = dict[keys[0]])
    • 其实我只是把dict改名为glossaryEntry
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 1970-01-01
    • 1970-01-01
    • 2014-09-15
    相关资源
    最近更新 更多