求助:使用NJsonSchema生成独立C#类文件时每个文件包含所有类
问题解决:用NJsonSchema为每个JSON模型生成独立C#类文件
问题分析
你当前的代码生成每个类文件时都会包含所有模型,核心原因有两个:
GenerateFile(rootName)方法默认会把当前类型及其所有依赖类型都输出到同一个文件- 原JSON是包含两个模型的顶层对象,
JsonSchema.FromSampleJson(json)会自动生成一个包含这两个模型的根类(比如示例里的User2)
解决方案
步骤1:清理Schema,移除多余根类
先过滤掉自动生成的无效根定义,只保留我们需要的User和LoginResponse。
步骤2:为每个模型单独生成类文件
针对每个目标定义创建独立的生成上下文,确保每个文件只包含对应类。修改后的代码如下:
public void GenerateClass() { string json = File.ReadAllText("json.json"); var rootSchema = JsonSchema.FromSampleJson(json); // 过滤出需要生成的目标模型定义,排除自动生成的根类 var targetDefinitions = rootSchema.Definitions .Where(kv => kv.Key is "User" or "LoginResponse") .ToList(); foreach (var entity in targetDefinitions) { // 创建仅包含当前模型的独立Schema var singleSchema = new JsonSchema(); singleSchema.Definitions.Add(entity.Key, entity.Value); // 配置生成器,禁用依赖类自动生成 var generator = new CSharpGenerator(singleSchema, new CSharpGeneratorSettings { ClassStyle = CSharpClassStyle.Poco, GenerateDependencyClasses = false }); // 仅生成当前模型的代码 var classCode = generator.GenerateType(entity.Key); // 补全命名空间和自动生成注释,保持格式一致 var fullCode = $@"//---------------------- // <auto-generated> // Generated using the NJsonSchema v11.0.0.0 (Newtonsoft.Json v13.0.0.0) // </auto-generated> //---------------------- namespace MyNamespace {{ #pragma warning disable // Disable all warnings {classCode} }}"; File.WriteAllText($"{entity.Key}.cs", fullCode); } }
代码说明
GenerateDependencyClasses = false:关闭依赖类自动生成到当前文件的逻辑GenerateType(entity.Key):只生成指定模型的代码,而非包含所有依赖的完整文件- 手动补充命名空间和注释,保证生成代码的格式与原逻辑一致
最终效果
修改后生成的User.cs仅包含User类,LoginResponse.cs仅包含LoginResponse类,不再出现多余的User2类和其他模型代码。
内容的提问来源于stack exchange,提问作者Mousa Ghajar Najafi
相关产品推荐
相关产品推荐

