Как получить и установить вложенные данные в Newtonsoft.Json.JObjectC#

Место общения программистов C#
Anonymous
Как получить и установить вложенные данные в Newtonsoft.Json.JObject

Сообщение Anonymous »

Я работаю на C# и часто использую объекты Newtonsoft.Json, поскольку взаимодействую с клиентским javascript и json.
У меня часто возникает сложная структура json, представляющая параметры что-то в классе C#. Обычно я заключаю большинство элементов в свойства C#, чтобы упростить их использование из C# (и обеспечить проверку типов во время компиляции).
Я хотел бы создать свойство, которое устанавливает многостраничность. страницы в массив строк. Элемент «многостраничный» может уже существовать, а может и не существовать.
Мне интересно, предоставляет ли Newtonsoft.Json простой способ гарантировать существование всех элементов в многоэлементном дереве при создании нового. ? Я попробовал

Код: Выделить всё

JObject j = new JObject();
j["multipage.keepSave"] = true;
Console.WriteLine(j.ToString());
но результат был (понятно - в json нет правил относительно того, что может быть в имени)

Код: Выделить всё

{
"multipage,keepSave": true
}
Альтернатива кажется немного утомительной:

Код: Выделить всё

void Main() {
Form f = new Form();
Console.WriteLine(f.KeepSave);
f.KeepSave = true;
Console.WriteLine(f.KeepSave);
f.KeepSave = false;
Console.WriteLine(f.KeepSave);
Console.WriteLine(f.Options.ToString());
}

public class Form {
public JObject Options = new JObject();
public bool KeepSave
{
get
{
JToken t = Options["multipage"];
if(t == null)
return false;
return (bool)t["keepsave"];
}
set {
JToken t = Options["multipage"];
if(t == null)
Options["multipage"] = t = new JObject();
t["keepsave"] = value;
}
}
}
Полагаю, я мог бы создать свой собственный общий код:

Код: Выделить всё

void Main() {
Form f = new Form();
Console.WriteLine(f.KeepSave);
f.KeepSave = true;
Console.WriteLine(f.KeepSave);
f.KeepSave = false;
Console.WriteLine(f.KeepSave);
Console.WriteLine(f.Options.ToString());
}

static public void SetJObject(JToken o, string path, object value) {
List p = path.Split('.').ToList();
for(int i = 0; i < p.Count - 1; i++) {
string name = p[i];
JToken j = o[name];
if(j == null)
o[name] = j = new JObject();
o = j;
}
o[p[p.Count - 1]] = JToken.FromObject(value);
}

public class Form {
public JObject Options = new JObject();
public bool KeepSave
{
get
{
JToken t = Options.SelectToken("multipage.keepsave");
return t == null ? false : (bool)t;
}
set {
SetJObject(Options, "multipage.keepsave", value);
}
}
}
Предложения по улучшению приветствуются!

Подробнее здесь: https://stackoverflow.com/questions/791 ... on-jobject

Вернуться в «C#»