Добавить свой тип данных в NewtonSoft JSON

У NewtonSoft есть такая фишка:

	json["int"] = myInt;
	json["bool"] = myBool;
	json["string"] = myString;

Он сам понимает, какой тип данных передан и пишет в нужном формате. При чтении просто указываем нужный формат и оно само вычитывается и кастится (или конвертится).
А можно туда как-то добавить свой тип, который он писать/читать не умеет?
Чтобы можно было делать так:

MyType myType = json.Value<MyType>("key");

Так сериализация/десереализация своих классов это и есть основной вариант использования.
Serializing and Deserializing JSON
Через атрибуты и другие штуки можно менять поведение.
Serialization Attributes

Если надо десериализовать только какую-то часть, то как-то так: Deserializing Partial JSON Fragments

Мне надо не весь класс, а просто отдельный enum в JSON и обратно.
Могу легко вручную. Но должен же быть способ.
Или надо к инаму метод FromString(string) прикрутить. Вероятно, через методы расширения.

StringEnumConverter
https://www.newtonsoft.com/json/help/html/SerializeWithJsonConverters.htm

Только непонятно как его использовать с JToken как тут

но можно просто в виде строки передать в JsonConvert.DeserializeObject.

Похоже, что оно только с коллекциями работает :thinking: Одиночный объект не даёт сконвертить.
Точнее, это не то что мне надо. Оно просто конвертит все поля инама в текстовый массив (и обратно). Не понятно, зачем это надо :man_shrugging:
А мне надо, например

Keys k = Keys.A;

записать значение k в JSON и вычитать обратно. Только enum будет свой.
Вручную это вообще просто сделать, только кода много будет.

Для просто значения и в самом .NET есть .ToString и Enum.Parse.

JSON это либо объект, либо список.

using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System;

namespace ConsoleApp9
{
    class MyClass
    {
        public StringComparison a;
        public int b;
    }

    class Program
    {
        static void Main(string[] args)
        {
            string json = JsonConvert.SerializeObject(
                new MyClass { a = StringComparison.Ordinal, b = 42 },
                new StringEnumConverter() // чтоб енумы были в виде строк
            );
            Console.WriteLine(json);

            var obj = JsonConvert.DeserializeObject<MyClass>(
                json,
                new StringEnumConverter()
            );
            Console.WriteLine(obj.a);
        }
    }
}

Для своих данных проще класс создать, а не ковыряться вручную.
Частичная десереализация это больше для случаев когда пришел большой JSON извне и нужна только его небольшая часть.

:dizzy_face: Точно есть? Блин, я не знал :man_facepalming:

Видимо, да :man_shrugging: Но моя идеология в том, что конфиги всегда должны быть доступны для ручного редактирования. А если какой-то параметр отсутствует или содержит недопустимое значение - заменить на дефолт. Всегда так писал и буду писать :man_shrugging: А при автоматической десериализации все параметры должны быть на месте, вроде :thinking:
Например, из-за отсутствующего или повреждённого конфига NFS 3 вообще не запускается. Хотя, там конфиг весит около 500 байт, КАРЛ!
По-моему, так делать это лютейший зашквар.

c# - Default value for missing properties with JSON.net - Stack Overflow

    [DefaultValue(5)]            

А если это значение надо вычислить на основе каких-то других данных? :thinking: Например, из того же JSONа? :man_shrugging:

Можно просто null и т.п. оставить и в конце посмотреть их )

Надо будет попробовать