Подтвердить что ты не робот

Xamarin + JSON.Net

У меня возникли проблемы с пониманием того, почему парсер Newtonsoft JSON должен быть специфичным для устройства в Xamarin. Я не могу найти способ найти парсер в общей, разделяемой библиотеке. Я использую приложение Tasky Pro. Я могу получить JSON.Net DLL из магазина Xamarin для работы в проектах Android и iOS, однако это не имеет архитектурного смысла. Например, материал SQLite находится в общей библиотеке, как и следовало ожидать, как один набор исходных файлов С#.

В идеале я хотел бы просто добавить ссылку на "Tasky.Core" и иметь возможность сериализовать/десериализовать JSON.

Есть ли способ заставить JSON.Net работать в общей библиотеке (через droid/ios/wp8)? Источник довольно большой, чтобы попытаться управлять связанными файлами, если это возможно...

Если нет, есть ли альтернативный способ управления JSON, который будет работать таким образом?

4b9b3361

Ответ 1

Вы можете использовать JSon.NET NuGet Package для этого. Реализация на самом деле зависит от платформы [1], но NuGet будет прозрачно заботиться об этом для вас и выбрать правильный для вас.

Обратите внимание, что для этого вам нужны Mono 3.2.6 и Xamarin.iOS 7.0.6, которые только что попали в альфа-канал на этой неделе, я только что исправил некоторые критические ошибки в этой области. Вы также должны обновить надстройку NuGet в Xamarin Studio до последней версии (0.8), которая содержит несколько исправлений ошибок, связанных с PCL.

Просто добавьте NuGet Add-In в Xamarin Studio, если вы еще этого не сделали, затем выполните поиск "JSon.NET", надстройка автоматически установит пакет и добавит нужные вам ссылки библиотек.

[1] Пакет NuGet содержит разные DLL файлы для разных целевых фреймворков, а затем выбирает и ссылается на лучший для вашего проекта - поэтому ваше приложение будет содержать только одну реализацию, но приложение iOS может использовать другое, настольного приложения.

Обновление 01/14/14:

Пакеты NuGet обычно содержат разные реализации - к сожалению, не все из них будут работать с Xamarin.iOS из-за API, таких как Reflection.Emit или Full DLR, которые недоступны в iOS.

Если вы посмотрите в каталог packages/Newtonsoft.Json.5.0.8/lib/, вы увидите разные подкаталоги - каждая из них содержит другую реализацию, а NuGet будет использовать ту, которая наилучшим образом соответствует текущей целевой структуре. К сожалению, NuGet не всегда выбирает правильный: - (

Для Newtonsoft.Json.5.0.8 реализация "portable-net45 + wp80 + win8" использует функции DLR, которые недоступны в iOS, "portable-net40 + sl4 + wp7 + win8" - это нормально. Поэтому, если вы добавите пакет NuGet в PCL, для таргетинга которого, например, Profile136, вы получите правильную реализацию.

Отсутствует GUI для выбора другой реализации, но вы можете редактировать файл .csproj. Заменить

<Reference Include="Newtonsoft.Json">
  <HintPath>..\packages\Newtonsoft.Json.5.0.8\lib\portable-net45+wp80+win8\Newtonsoft.Json.dll</HintPath>
</Reference>

с

<Reference Include="Newtonsoft.Json">
  <HintPath>..\packages\Newtonsoft.Json.5.0.8\lib\portable-net40+sl4+wp7+win8\Newtonsoft.Json.dll</HintPath>
</Reference>

и он должен работать.

В общем случае, когда вы получаете сообщение об отсутствии пропущенных типов после добавления нового пакета NuGet, перейдите в соответствующий каталог пакета и grep -r для этого символа - есть вероятность, что существует другая реализация, которая не использует этот тип.

Надеюсь, в будущем будет доступно более элегантное решение, но для этого потребуется координация с командой NuGet и авторами пакетов, поэтому потребуется некоторое время.

Ответ 2

Просто добавьте его в общую библиотеку через NuGet. На самом деле, все ваши запросы/ответы должны выполняться в библиотеке. Вы должны использовать JSON.Net для анализа ответа.