Как получить и установить вложенные данные в 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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