Десериализация JSON с MonoTouch - PullRequest
       15

Десериализация JSON с MonoTouch

7 голосов
/ 15 февраля 2011

в Интернете есть различные ресурсы, объясняющие, как сериализовать некоторый объект C # в строку JSON. Я не смог заставить ни одного из них работать с MonoTouch 3.2.4 , хотя.

Альтернативы, с которыми я сталкивался:

  • Пространство имен System.Json
    Я уже успешно использую пространство имен System.Json для десериализации данных. Поэтому для простоты я бы предпочел придерживаться этого, если это возможно. К сожалению, я не знаю, как сериализовать с ним (или, если это вообще возможно).

  • System.Runtime.Serialization.Json.DataContractJsonSerializer
    Пространство имен System.Runtime.Serialization.Json недоступно в MonoTouch. Я где-то читал, что это часть .NET 3.5 и что MonoTouch находится на уровне .NET 2.0. Это может объяснить это.

  • System.Web.Script.Serialization.JavaScriptSerializer
    Этого также нет в MonoTouch (фактически, кажется, что доступны только System.Web.Services).

  • Json.NET от Джеймса Ньютона-Кинга
    Мне удалось заставить это работать на симуляторе, включая сборку .NET 2.0 и используя Newtonsoft.Json.JsonConvert.SerializeObject (). Однако, это не компилируется для устройства с ошибкой « mtouch не удалось без вывода ». Как только я удаляю ссылку на сборку, она прекрасно компилируется.

Есть ли способ заставить один из них работать с MonoTouch? Есть ли другие варианты, чтобы попробовать?

Спасибо

Ответы [ 2 ]

7 голосов
/ 15 февраля 2011

Я бы порекомендовал использовать библиотеку System.Json, которую не так сложно использовать и переносить в класс, чтобы сделать его строго типизированным. Он также включен в сборку по умолчанию с MonoTouch, поскольку он был унаследован от Silverlight.

Чтобы загрузить это:

JsonValue value = JsonObject.Load(stream); //There are other overloads here, my stream is off an HttpWebRequest

Вот пример по индексу:

this.StringValue = value[0];
this.IntValue = value[1];

Одно мое имя:

this.StringValue = value["StringValue"];
this.IntValue = value["IntValue"];

Где , это - класс со строковым свойством с именем StringValue и свойством int с именем IntValue. По большей части класс JsonValue будет приводить к вашим типам неявно.

Что я делаю, так это создаю класс для хранения всей информации Json строго типизированным образом, а затем передаю JsonValue в конструкторе для выполнения уродливых слабо типизированных вещей.

Для других библиотек вы столкнетесь с проблемами, когда MonoTouch удаляет типы, которые считаются «неиспользуемыми» при создании с помощью отражения (например, при использовании XmlSerializer). Я столкнулся с этой проблемой больше, чем нужно, мне пришлось добавить PreserveAttribute для типов и т. Д.

По этому вопросу читайте здесь для получения дополнительной информации о заповеднике: MonoTouch Doc

1 голос
/ 23 июля 2014

У меня нет уличного кредита, поэтому я не могу оставить комментарий к ответу выше ..

Просто хотел опубликовать предупреждение при использовании метода System.Json.JsonObject.ToString (). Я использовал это, и, похоже, сгенерировал JSON нормально ... тогда у меня была строка с возвращением (\ n) в нем. Он не избежал этого должным образом, и в результате получился плохой JSON ..

Итак, если у вас есть простой JSON, он может работать просто отлично, но если вы знаете, что в ваших строках могут быть специальные символы, которые требуют экранирования, вам следует сначала проверить этот метод ToString ().

Я думаю, что JSON-библиотека newtonsoft выглядит как альтернатива. Информация об этом есть на сайте Xamarin:

https://components.xamarin.com/view/json.net

Понимаю, что это ужасный ответ, но просто хотел опубликовать предупреждение пользователям системы json lib.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...