Получение данных из файла JSON с помощью Json.NET и создание файла c-sharp с использованием текстового шаблона T4 - PullRequest
0 голосов
/ 23 октября 2018

Я хочу создать файл Subject.cs программно.Для этого, когда я искал в Интернете, я увидел, что могу использовать текстовые шаблоны T4.Теперь я хочу получить данные из файла JSON с помощью Json.NET и установить значения Root в качестве свойства, например:

namespace Library
{
    class Subject
    {
        public static int forensic_medicine { get; set; }
        public static int family_law { get; set; }
        public static int constitutional_law { get; set; }
        public static int obligations_law { get; set; }
    }
}

Вот содержимое файла JSON:

{
    "Subjects": [
        {
            "Root": "forensic_medicine",
            "Name": "Forensic Medicine",
            "StrID": "FMD",
            "RowID": 746
        },
        {
            "Root": "family_law",
            "Name": "Family Law",
            "StrID": "FML",
            "RowID": 1239
        },
        {
            "Root": "constitutional_law",
            "Name": "Constitutional Law",
            "StrID": "CNL",
            "RowID": 996
        },
        {
            "Root": "obligations_law",
            "Name": "Obligations Law",
            "StrID": "OBL",
            "RowID": 1672
        }
    ],
    "is_restart": 0,
    "book_path": "D:\\Colin\\_books\\",
    "thesis_path": "D:\\Colin\\_thesises\\",
    "full_screen": false
}

Я думаю, я должен использовать классы SubjectList и Subject для чтения и получения данных из файла JSON.Для этого я использую следующие классы:

public class SubjectList
{
    public List<Subject> Subjects { get; set; }
}

public class Subject
{
    public string StrID { get; set; }
    public string Name { get; set; }
    public string Root { get; set; }
    public int RowID { get; set; }
}

И, наконец, для получения данных я использую такой код:

var json = JsonConvert.DeserializeObject<SubjectList>(File.ReadAllText("D:\\Colin\\_test\\inf.json"));

В файле текстового шаблона (Subjects.tt), коды здесь:

<#@ template debug="true" hostspecific="true" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="$(SolutionDir)Test\bin\Debug\Newtonsoft.Json.dll" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".cs" #>
namespace Library
{
    public class Subject
    {
        <#
            var json = JsonConvert.DeserializeObject<SubjectList>(File.ReadAllText("D:\\Colin\\_test\\inf.json"));
        #>
    }
}

Я получаю следующие ошибки, не делая ничего другого.

Compiling transformation: The name 'JsonConvert' does not exist in the current context

Compiling transformation: The type or namespace name 'SubjectList' could not be found (are you missing a using directive or an assembly reference?)

Я думаю, что мне нужно использовать SubjectList и Subject классы в файле Subjects.tt, но я не знаю, как мне это сделать.Что еще более важно, как я могу создать файл Subject.cs программно, без проблем?

Ответы [ 2 ]

0 голосов
/ 15 апреля 2019

Чтобы использовать любую ссылку в сборке (будь то пакет NuGet, например, Newtonsoft.Json или даже вывод проекта), необходимо добавить директивы импорта и для сборки.В конкретном случае попробуйте добавить указанную сборку, просто используя имя сборки напрямую.Кроме того, было бы неплохо прочитать в вашем файле json текст самого шаблона.Пример:

<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.IO" #>
<#@ assembly name="Newtonsoft.Json" #>
<#@ import namespace="Newtonsoft.Json" #>
<#@ import namespace="Newtonsoft.Json.Linq" #>
<#@ output extension=".cs" #>
<#
    string templateFileName = Path.GetFileNameWithoutExtension(this.Host.TemplateFile);
    string settingsPath = this.Host.ResolvePath($"{templateFileName}.json");
    string settingsJson = File.ReadAllText(settingsPath);
    var datasource = JObject.Parse(settingsJson);
#>
0 голосов
/ 19 декабря 2018

Как минимум, вам нужно добавить дополнительные <#@ import namespace="Newtonsoft.Json" #> для пространства имен Newtonsoft

...