首页 > 解决方案 > 将 JavaScript 对象解析为 C# 的问题

问题描述

我正在将包含对象值的 js 文件解析为 C# 对象。现在 - 我已经将 JS 代码转换为 JSON,然后尝试转换为 C# 对象。
我在想出如何在 C# 中生成对象时遇到问题。我尝试过多种尝试,主要是使用字典(Dictionary<string,[object])。我用谷歌搜索,在多个问题中访问了 SO,目前没有成功——我所有的想法都导致了空对象。

重要提示 - 我无法更改 JS 的来源,之后可以更改任何内容。

最新的对象理念:

   public class SingleFarm
   {
        public List<string> Modules { get; set; }
        public List<string> Servers { get; set; }
   }

    public class SingleEnv
    {
        public Dictionary<string, SingleFarm> Farms { get; set; }
    }

    public class FarmsModel
    {
        public Dictionary<string, SingleEnv> FarmsModel { get; set; }
    }

解析代码:

var farmsText = File.ReadAllText(filePath);

//using Jurassic
var engine = new ScriptEngine();
var result = engine.Evaluate(farmsText);
var json = JSONObject.Stringify(engine, result);

var parsed = JsonConvert.DeserializeObject<FarmsModel>(json);

JS文件来源:

var environments = {};
environments['ENV1'] = {
    "WWW": {
        "Modules": [
            "module21"
        ],
        "Servers": [
            "a-1"
        ]
    }
};

environments['ENV2'] = {
    "FARM1": {
        "Modules": [
            "module41"
        ],
        "Servers": [
            "s1",
            "s2"
        ]
    },
    "FARM2": {
        "Modules": [
            "module11"
        ],
        "Servers": [
            ""
        ]
    },
    "FARM3": {
        "Modules": [
            "module1"
        ],
        "Servers": [
            ""
        ]
    }
};

environments['ENV3'] = {
    "FARM1": {
        "Modules": [
            "module10"
        ],
        "Servers": [
            "server1"
        ]
    },
    "FARM2": {
        "Modules": [
            "module22"
        ],
        "Servers": [
            ""
        ]
    },
    "FARM3": {
        "Modules": [
            "module33"
        ],
        "Servers": [
            "server3"
        ]
    }
};

JSON 如下所示:

{
    "ENV1": {
        "WWW": {
            "Modules": [
                "module21"
            ],
            "Servers": [
                "a-1"
            ]
        }
    },
    "ENV2": {
        "FARM1": {
            "Modules": [
                "module41"
            ],
            "Servers": [
                "s1",
                "s2"
            ]
        },
        "FARM2": {
            "Modules": [
                "module11"
            ],
            "Servers": [
                ""
            ]
        },
        "FARM3": {
            "Modules": [
                "module1"
            ],
            "Servers": [
                ""
            ]
        }
    },
    "ENV3": {
        "FARM1": {
            "Modules": [
                "module10"
            ],
            "Servers": [
                "server1"
            ]
        },
        "FARM2": {
            "Modules": [
                "module22"
            ],
            "Servers": [
                ""
            ]
        },
        "FARM3": {
            "Modules": [
                "module33"
            ],
            "Servers": [
                "server3"
            ]
        }
    }
}

你有什么想法?

标签: c#json

解决方案


您不应该尝试将字典序列化为对象,因为它会尝试映射属性名称。

如果你使用

var parsed = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, SingleFarm>>>(json);

它应该工作。小提琴


推荐阅读