По просьбе трудящихся выложил наброски будущей либы по работе с джейсоном. Пока положил ее в snippets/peg-parser/Json, когда решится вопрос о dirhier она будет перенесена.
Сейчас в ней есть парсер джейсона в ast и макрос для создания ast джейсона прямо в коде:
пример использования:
def arr = json([ 1, 2 ]); // создание массива
def obj = json({ "a" : 1; "b": arr} ); // создание объекта
def test = json({
a : arr; // внедрение массива в другой объект
b : obj; // внедрение объекта в другой объект
c : null;
d : true;
e : { a : 1; "la la": null};
"f" : [true];
j : (43 + 55); // в j запишется 98, допустимы любые выражения приводящиеся к типам джейсона: string, bool, double, скобки обязательны
});
WriteLine(test); // test.ToString() выдает текстовый джейсон
def parser = JsonParser(); // парсер текстового джейсона
def reloaded = parser.Parse(test.ToString());
match (reloaded)
{
| Some(obj) =>
WriteLine(obj);
when (obj.ToString() != test.ToString())
WriteLine("Textual difference");
| None =>
WriteLine("Cant parse");
}
Сразу скажу, это пока просто эксперимент, эта либа мне понадобится в следующем году. Тогда и буду доводить ее до ума. Сейчас там не хватает кучи фич для нормального конструирования джейсона и автоматической сериализации/десереализации объектов.
Ньютон джейсон там только для бенчмарков, он не нужен для работы библиотеки. Парсер я переписал и он стал чуть медленнее, но все равно рвет ньютона. Что странно, неплохо рвет и сериализация ast в строку, чего там делает ньютон лишнего я не знаю. Код прямой до безобразия.