Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Примитивный JSON Schema валидатор для Objective-C

Anna | 2.07.2014 | нет комментариев

Пока типичные разработчики пишут приложения я изобретаю велосипеды.

Вероятно многие разработчики сталкивались с обстановкой, когда мобильное приложение разрабатывается параллельно с бэкэндом. При этом частенько конструкции данных, приходящие в результат на запрос с сервера, могут меняться. Скажем, на стороне бэкэнда решат поменять именование одного из ключиков JSON-а, позабыв предупредить о этом мобильную команду. Я теснее не говорю про обстановки, когда CamelCase нотацию «неожиданно» решили поменять на underscore либо напротив. Вы можете сказать, что налицо плохая организация процесса и недочет общения команд, и будете безусловно правы. Но когда приложение на телефоне клиента перестает трудиться на демо все взоры устремляются на мобильщиков.


Одним из выходов из расположения является валидация присланного JSON’а в соответствии с JSON-схемой(обзорная статья о JSON схемах).

Скажем, если присланный нам JSON

{
    "numberKey" : 100500,
    "arrayKey" : [
    {
        "number" : 1 ,
        "string" : "1"
    },
    {
        "number" : 2 ,
        "string" : "2"
    },
    {
        "number" : 3 ,
        "string" : "3"
    }
    ]
}

Минимальной JSON схемой, его описывающей будет

{
    "type" : "object",
    "properties" : {
        "numberKey" : {
            "type" : "number"
        },
        "arrayKey" : {
            "type" : "array",
            "items" : {
                "type" : "object",
                "properties" : {
                    "number" : {
                        "type" : "number"
                    },
                    "string" : {
                        "type" : "string"
                    }
                }
            }
        }
    }
}

Все, что нам в идеале необходимо, это взять присланный JSON и провалидировать его с поддержкой схемы. Казалось-бы, задача решена. JSON-schema — это типовой метод изложения JSON’а и валидаторы есть под многие языки программирования. Но искания валидатора для языка Objective-C никакого приписываемого итога не дали, следственно было решено пойти по пути велосипедостроения.

В результате на свет возникло поделие под наименованием JsonSchemaValidator (bitbucket). Для тех, кто захочет испробовать:

pod 'SVJsonSchemaValidator'

Так, с поддержкой этой библиотечки мы можем составить схему:

id schema = [[SVType object] properties:@{
@“numberKey”:[SVType number],
@“arrayKey”:[[SVType array] items:[[SVType object] properties:@{
@“number” : [SVType number],
@“string” : [SVType string]
}]]
}];

Как видите, схема примерно один к одному повторяет сам JSON. Сейчас провалидируем его:

NSError* error = nil;
id validatedJson = [schema validateJson:json error:&error];

Тут переменные:
json — это распаршенный любым парсером JSON (скажем, с поддержкой NSJSONSerialization).
validatedJson — только те объекты, которые прошли валидацию.
error — больше либо менее приписываемое изложение того, какие объекты валидацию не прошли. nil — если все OK.

Представим, что у вас теснее есть класс модели

@interface MyModelObject : NSObject

@property (strong, nonatomic) NSString* string;
@property (strong, nonatomic) NSNumber* number;

@end

И делать двойную работу, и описывать в схеме теснее существующие классы не хочется. Дозволено сделать схему прямо из этого класса:

id schema = [[SVType object] properties:@{
@“numberKey”:[SVType number],
@“arrayKey”:[[SVType array] items:[MyModelObject jsonSchema]]
}];

С поддержкой objc-runtime способ -jsonSchema для класса MyModelObject пройдется по каждому свойствам, которые дозволено представить в JSON и сгенерирует верно такую-же схему. С поддержкой этой же схемы дозволено инстанциировать обьекты типа MyModelObject и заполнить их свойства соответствующими значениями через KVC:

NSDictionary* instanciated = [schema instantiateValidatedJson:validated];

(lldb) po instanciated
$1 = 0x0755fe70 {
numberKey = 100500,
arrayKey =     (
“<MyModelObject: 0x7554a30>”,
“<MyModelObject: 0×7554610>”,
“<MyModelObject: 0x75543b0>”,
“<MyModelObject: 0x75619b0>”
);
}

Вот и все, что реализовано на данный момент.
А сейчас вопрос, ради которого данный короткий топик и писался: необходим ли данный велосипед кому нибудь, а если да, то что от него еще требуется? Результаты ожидаю в камментах.

 

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB