如何使用JINT从JS文件读取JSON对象并在.NET中序列化处理?
解决.NET中通过JINT序列化JS里JSON对象的问题
首先,咱们已经用JINT执行了包含那两个JSON对象的JS文件,接下来核心就是把JINT返回的Value对象转换成.NET可以直接操作的实体或者集合。我给你整理了两种常用的实现方式,一种是强类型实体类(推荐,有编译时检查),另一种是动态类型(适合结构不固定的场景)。
步骤1:定义对应的.NET实体类(强类型方案)
根据你JS里的结构,咱们可以定义匹配的类:
// 对应languages对象的结构 public class LanguageCollection { public List<string> Languages { get; set; } } // labels是一个数组,每个元素是键值对,键是类似$JOB的标识,值是多语言列表 // 这里用Dictionary<string, List<string>>来接收每个元素,因为键可能不固定
步骤2:完整代码实现(用System.Text.Json)
using Jint; using System.Text.Json; using System.IO; // 读取JS文件内容 var fileContents = File.ReadAllText("你的JS文件路径.js"); // 初始化JINT引擎并执行JS代码 var jsEngine = new Engine(); jsEngine.Execute(fileContents); // 获取JS中的两个变量 var languagesJsValue = jsEngine.GetValue("languages"); var labelsJsValue = jsEngine.GetValue("labels"); // 将JINT的Value对象转换为JSON字符串 var languagesJson = languagesJsValue.ToJson(); var labelsJson = labelsJsValue.ToJson(); // 反序列化为.NET对象 var languages = JsonSerializer.Deserialize<LanguageCollection>(languagesJson); var labels = JsonSerializer.Deserialize<List<Dictionary<string, List<string>>>>(labelsJson); // 测试使用 Console.WriteLine($"第一个语言:{languages.Languages[0]}"); Console.WriteLine($"$JOB的德语翻译:{labels[0]["$JOB"][2]}");
备选方案:用动态类型(无需定义实体类)
如果你的标签键(比如$JOB、$JOB_NO)是动态变化的,不想定义实体类,可以直接转成动态对象:
using Jint; // 前面步骤和上面一致 dynamic languagesDynamic = languagesJsValue.ToObject(); dynamic labelsDynamic = labelsJsValue.ToObject(); // 直接访问属性/元素 var cymraegLang = languagesDynamic.Languages[1]; var jobNumberWelsh = labelsDynamic[1].$JOB_NO[1];
注意事项
- 如果你的项目用的是Newtonsoft.Json(Json.NET),只需要把反序列化的代码换成
JsonConvert.DeserializeObject即可,用法和System.Text.Json基本一致。 - JINT的
ToJson()方法已经帮我们处理了JS对象到JSON字符串的转换,不需要手动拼接,避免格式错误。
内容的提问来源于stack exchange,提问作者mister_b
相关产品推荐
相关产品推荐

