Задача сохранить данные из базы MS SQL Server в файл в формате Json, а потом, конечно, восстановить обратно, то есть типа Backup – Restore операции.
Структура данных на картинке ниже, как видно, не простая и для восстановления придется учитывать и сохранить все взаимосвязи по внешним ключам.

Добавим Юзера в качестве корневого элемента объекта бэкапа. Я не совсем понимаю терминологию Newtonsoft, чем отличается и зачем JObject от JToken. Ну пускай будет так: backupJsonObject это объект, а user = backupJsonObject[“User”] и другие как Accounts это токены.
public static void BackupSaveJson(string filePath)
{
JObject backupJsonObject = new JObject();
//Сохранить пользователя
DataTable dt = G.db_select($"select * from Users where ID = {U.Cur.ID}");
string userJsonString = JsonConvert.SerializeObject(dt);
backupJsonObject.Add("User", JToken.Parse(userJsonString)[0]);
JToken user = backupJsonObject["User"];
//Сохранить все мои Счета
dt = G.db_select($"select * from Accounts where UserID = {U.Cur.ID}");
string accountsJsonString = JsonConvert.SerializeObject(dt);
//Мои счета сохраняю как объект внутри Юзера
user["Accounts"] = JToken.Parse(accountsJsonString);
//Сохранить все мои Категории
dt = G.db_select($"select * from Categories where UserID = {U.Cur.ID}");
string categoriesJsonString = JsonConvert.SerializeObject(dt);
user["Categories"] = JToken.Parse(categoriesJsonString);
//Сохранить все операции по всем моим счетам
dt = G.db_select($"select o.* from Operations o join Accounts a on a.ID in (Debet_ID, Credit_ID) where UserID = {U.Cur.ID}");
string operationsJsonString = JsonConvert.SerializeObject(dt);
user["Operations"] = JToken.Parse(operationsJsonString);
//Сохранить остатки по всем моим счетам, можно даже не делать этого, так как есть операции, но на всякий
//При восстановлении, можно проверить остатки из операций с остатками в сохраненном бэкапе
dt = G.db_select($"select r.* from Acc_Rests r join Accounts a on a.ID = r.Account_ID where UserID = {U.Cur.ID}");
string accRestsJsonString = JsonConvert.SerializeObject(dt);
user["Acc_Rests"] = JToken.Parse(accRestsJsonString);
File.WriteAllText(filePath, backupJsonObject.ToString());
}
Будьте внимательны, так как есть JObject.Parse(jsonString1), а есть еще JToken.Parse(jsonString2). Так вот некоторые строки парсятся ка объект, а другие как токен, если перепутать, получим ошибку.