Вспомнил я тут дела четырехлетней давности.
Беру я, короче, geojson и OCaml.
Уже смешно, да?
Для тех, кто совсем не понимает, объясняю:
— geojson — странный, уникальный формат, необходимость парсить который возникает только у меня;
— OCaml — самый лучший язык программирования с самыми лучшими библиотеками.
Беру я самый лучший парсер json’а atdgen. Можно декларативно схемы json’а задавать, и он сам их в окамловые типы переводит! Охуеть!
Быстро выясняется, что geojson-— плохой формат, и atdgen на такие дурацкие форматы не расчитан. Ну не может такой умный парсер понять, как это так — объект coordinates бывает то двумя циферками — для точек, то списком по две циферки — для линий, то списком списков по две циферки — для полигонов. У нас в окамле все научно и такую хуйню вытворять нельзя.
Ну да хуй с ним. Есть способ все парсить atdgen’ом, а координаты парсить во внутренние типы нижележащего парсера json’а, который называется yojson. Да вот беда — этот парсер тоже писали программисты на самом лучшем языке, а в самом лучшем языке нет никакого numeric, как в json’е, а есть или int, или float. И этот парсер выдает float, если видит широту 66.0, и int — если 66. Без точки. Поэтому корректная обработка координат выглядит так:
match coordinate with
| `List [`Floatlit lon; `Floatlit lat]
| `List [`Intlit lon; `Floatlit lat]
| `List [`Floatlit lon; `Intlit lat]
| `List [`Intlit lon; `Intlit lat] ->
float_of_string lat, float_of_string lon
Про весь этот фрактал пиздеца я уже давно забыл, как про страшный сон. Но недавний холивар заставил вспомнить снова.
Если вам, не дай Бог, придется работать с такими сложными форматами, как json или xml — Бога ради, не берите хороший, научный язык. Берите хуевый. Там все будет работать.