如何用C#解析JS文件中含‘Name = ’格式的类JSON内容?
解决C#解析带变量赋值的类JSON JS文件问题
这个问题很常见——你的JS文件是JS变量赋值格式,不是标准JSON,所以Newtonsoft.Json(Json.NET)没法直接解析。下面给你两种实用的解决思路,根据你的场景选就行:
方法1:文本预处理转标准JSON
核心思路是把非标准的JS格式转换成Newtonsoft能识别的JSON结构,不需要额外依赖。
具体步骤&代码示例
假设你的JS文件内容是:
Name1 = { p1:0, p2:1, p3:2 }; Name2 = { p1:"None", p2:"Snappy", p3:"gzip" };
我们可以通过字符串替换+正则把它转换成{"Name1": {"p1":0,...}, "Name2": {"p1":"None",...}}这种标准JSON:
using System.IO; using System.Text.RegularExpressions; using Newtonsoft.Json; // 1. 读取文件内容 string jsContent = File.ReadAllText("your-file.js"); // 2. 清理注释(如果文件有注释的话,必须先处理) string cleaned = Regex.Replace(jsContent, @"//.*$", "", RegexOptions.Multiline); // 去掉单行注释 cleaned = Regex.Replace(cleaned, @"/\*.*?\*/", "", RegexOptions.Singleline); // 去掉多行注释 // 3. 去掉分号、多余空格 cleaned = cleaned.Replace(";", "").Trim(); // 4. 给JS属性名加双引号(JSON要求属性名必须带双引号) cleaned = Regex.Replace(cleaned, @"(\w+):", "\"$1\":"); // 5. 把变量赋值格式转成JSON键值对 cleaned = Regex.Replace(cleaned, @"(\w+)\s*=", "\"$1\":"); // 6. 包裹成完整的JSON对象 string validJson = $"{{ {cleaned} }}"; // 7. 现在可以用Newtonsoft解析了 // 用动态类型处理不同属性值(比如Name1的p1是数字,Name2的p1是字符串) var result = JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(validJson); // 访问示例 int name1P1 = result["Name1"].p1; string name2P1 = result["Name2"].p1;
优缺点
- ✅ 优点:不需要引入第三方库,轻量快速
- ❌ 缺点:正则匹配依赖固定格式,如果JS文件里有复杂内容(比如字符串里包含
:, 变量名带特殊字符),正则可能失效,适合结构简单的场景
方法2:用.NET JS引擎直接执行解析
如果你的JS文件结构复杂(比如有函数、复杂表达式、特殊字符变量名),预处理容易出错,推荐用Jint(一个轻量的.NET JavaScript引擎)直接执行JS代码,获取变量值。
具体步骤&代码示例
- 先安装Jint NuGet包:
Install-Package Jint(或者在NuGet管理器里搜索Jint安装) - 编写代码执行JS并获取变量:
using System.IO; using Jint; // 1. 初始化JS引擎 var engine = new Engine(); // 2. 执行JS文件内容 engine.Execute(File.ReadAllText("your-file.js")); // 3. 获取指定变量的值,支持转成强类型或动态类型 // 转成动态类型 dynamic name1 = engine.GetValue("Name1").ToObject(); dynamic name2 = engine.GetValue("Name2").ToObject(); // 或者转成自定义强类型(注意属性类型要匹配,比如p1可能是int或string,建议用object/dynamic) public class ConfigItem { public object p1 { get; set; } public string p2 { get; set; } public string p3 { get; set; } } var name1Strong = engine.GetValue("Name1").ToObject<ConfigItem>();
优缺点
- ✅ 优点:完全兼容JS语法,不管结构多复杂都能正确解析,最可靠
- ❌ 缺点:需要引入第三方库,性能比纯文本处理稍差(但绝大多数场景可以忽略)
额外提示
如果你的JS文件里有大量类似的变量赋值,两种方法都可以批量处理。比如用方法1解析后得到的Dictionary<string, dynamic>可以直接遍历所有配置项,非常方便。
内容的提问来源于stack exchange,提问作者Ariel
相关产品推荐
相关产品推荐

