Как создать фиктивные данные JSON на клиенте в объектном C/iOS?

Я хочу настроить статические фиктивные данные в формате JSON для обработки моим приложением. Это чисто на стороне клиента; Я не хочу получать что-либо из сети.

Все вопросы и ответы, которые я видел до сих пор, имеют переменные NSData*, в которых хранится то, что извлекается из сетевых вызовов, и [JSONSerialization JSONObjectWithData: ...], обычно воздействующие на данные, которые не были созданы вручную.

Вот пример того, что я пробовал в xcode.

NSString* jsonData = @" \"things\": [{ \
\"id\": \"someIdentifier12345\", \
\"name\": \"Danny\" \
\"questions\": [ \
    { \
        \"id\": \"questionId1\", \
        \"name\": \"Creating dummy JSON data by hand.\" \
    }, \
    { \
        \"id\": \"questionId2\", \
        \"name\": \"Why no workie?\"
    } \
    ], \
\"websiteWithCoolPeople\": \"http://stackoverflow.com\", \
}]}";

NSError *error;
NSDictionary *parsedJsonData = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&error];

Подобные попытки (и попытки что-то изменить, например переключение NSString* на NSData* из этой строки JSON) привели к нулевым данным parsedJsonData или исключениям при попытке создать эту переменную данных JSON или при попытке ее анализа.

Как создать фиктивные данные JSON в собственном коде, чтобы их можно было анализировать с помощью обычных классов Foundation, которые анализируют данные JSON?


person Danny    schedule 27.03.2013    source источник
comment
Я не верю, что JSON может начинаться со строки. Попробуйте добавить { в начало перед "things". После этого возьмите свою строку и используйте метод [jsonData dataUsingEncoding:NSUTF8StringEncoding], так как NSJSONSerialization принимает только данные, а не строку :)   -  person anon_dev1234    schedule 27.03.2013
comment
Спасибо. Я пробовал этот маршрут раньше, но вы обнаружили, что я, возможно, неправильно сформировал JSON, поэтому я не могу создать данные вручную. Не могли бы вы опубликовать небольшой пример того, как должен выглядеть JSON, пока я опробую новый JSON? Если это сработает, то я отмечу ваш ответ как ответ, поскольку люди, пытающиеся сделать это, вполне могли неправильно сформировать JSON как проблему.   -  person Danny    schedule 27.03.2013
comment
Когда мне нужно это сделать, у меня есть текстовый файл, содержащий json в комплекте приложения, а не NSString в коде. Я думаю, что это упрощает замену ваших рабочих URL-адресов, а также должно быть проще форматировать.   -  person James P    schedule 28.03.2013
comment
Когда вы закодируете строку, добавьте NSLog, чтобы распечатать ее, и скопируйте/вставьте на сайт, например json. parser.online.fr для проверки синтаксиса.   -  person Hot Licks    schedule 28.03.2013
comment
А синтаксис JSON довольно прост. Вы можете усвоить основы за 5 минут, и у вас останется время, чтобы приготовить кофе.   -  person Hot Licks    schedule 28.03.2013
comment
(Существуют сторонние пакеты JSON, такие как SBJSON, которые принимают NSString.)   -  person Hot Licks    schedule 28.03.2013


Ответы (5)


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

Я правильно отформатировал ваш JSON (используя jsonlint) и сохранил его в файле с именем testData.json в комплекте приложения.

{"things":
    [{
     "id": "someIdentifier12345",
     "name": "Danny",
     "questions": [
                   {
                   "id": "questionId1",
                   "name": "Creating dummy JSON data by hand."
                   },
                   {
                   "id": "questionId2",
                   "name": "Why no workie?"
                   } 
                   ], 
     "websiteWithCoolPeople": "http://stackoverflow.com" 
     }]
}

Затем, чтобы проанализировать этот файл в своем приложении, вы можете просто загрузить файл из каталога пакета.

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"testdata" ofType:@"json"];
NSData *jsonData = [[NSData alloc] initWithContentsOfFile:filePath];

NSError *error = nil;
NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];

NSLog(@"%@", jsonDict);

Теперь было бы довольно легко расширить это, чтобы загружать любое количество ответов и, по сути, иметь локальный веб-сервис. Тогда было бы несложно адаптировать это для загрузки ответов с удаленного сервера.

person James P    schedule 27.03.2013
comment
Люблю инструкции для внешнего файла. Отличный ответ! - person Danny; 28.03.2013
comment
@James P, как мне создать файл JSON? - person Bharat Modi; 15.03.2016
comment
Просто поместите свой JSON в обычный текстовый файл и измените расширение с .txt на .json. - person James P; 15.03.2016

Попробуйте что-нибудь подобное!!

NSDictionary *jsonObject = @{@"id": @"someIdentifier",
                             @"name":@"Danny",
                             @"questions":@[
                                            @{@"id":@"questionId1",
                                              @"name":@"Creating dummy JSON"},
                                            @{@"id":@"questionId2",
                                              @"name":@"Creating dummy JSON"},
                                            @{@"id":@"questionId3",
                                              @"name":@"Creating dummy JSON"}],
                             @"websiteCoolPeople":@"http://stackoverflow.com"};


NSLog(@" JSON = %@",jsonObject); // let's see if is correct

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonObject options:NSJSONWritingPrettyPrinted error:nil];

NSLog(@" JSON DATA \n  %@",[NSString stringWithCString:[jsonData bytes] encoding:NSUTF8StringEncoding]);


//lets make a check

if ([NSJSONSerialization isValidJSONObject:jsonObject] == YES) {

    NSLog(@" ;) \n");
}
else{

    NSLog(@"Epic Fail! \n");

}


//Going back

NSDictionary *parsedJSONObject = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:nil];


NSLog(@"Cool! :  %@",parsedJSONObject);
person Massimiliano Del Maestro    schedule 27.03.2013
comment
Мне нравится, что ваш ответ четко создал JSON со словарем и что он использовал данные, связанные с моим исходным вопросом. Таким образом, будущим искателям будет легко следовать за вами. - person Danny; 28.03.2013

прежде всего

-(void)createJsonData
{
    //your objects for json
    NSArray * objects=@[@"object1",@"object2",@"object3",@"object4"];
    //your keys for json
    NSArray * keys=@[@"key1",@"key2",@"key3",@"key4"];

    //create dictionary to convert json object
    NSDictionary * jsonData=[[NSMutableDictionary alloc] initWithObjects:objects forKeys:keys];


    //convert dictionary to json data
    NSData * json =[NSJSONSerialization dataWithJSONObject:jsonData options:NSJSONWritingPrettyPrinted error:nil];


    //convert json data to string for showing if you create it truely
    NSString * jsonString=[[NSString alloc] initWithData:json encoding:NSUTF8StringEncoding];

    NSLog(@"%@",jsonString);
}

это создает jsonData. другой факт заключается в том, что для создания данных следует использовать dataWithJSONObject. и этот метод принимает NSDictionary или NSArray. NSString не является допустимым классом для этого метода.

person meth    schedule 27.03.2013

Ответ заключается в создании правильно сформированного JSON. Если ваш JSON искажен, когда вы создаете его вручную, вы просто получите общее «нулевое» значение из сериализации. Вот вещи, которые сводили меня с ума, потому что они были незначительными факторами, пока @bgoers не упомянул один из них.

  • Убедитесь, что вы включаете правильные фигурные скобки ([{}]) и закрываете их соответствующим образом. На самом деле это немаловажный фактор, но если вы основываете свои данные на документации (как я), вы можете пропустить копирование/вставку одной из фигурных скобок.
  • При копировании/вставке данных JSON убедитесь, что все используемые символы, особенно «кавычки», одинаковы. Оказалось, что я использовал причудливые открывающие и закрывающие кавычки, которые были закодированы в документации, а не просто ", которые вы вводили в xcode.

Когда у вас есть действительный JSON, классы Foundation должны работать нормально.

person Danny    schedule 27.03.2013

#import "SBJSON.h"

NSDictionary *dictionary = [[NSDictionary alloc] initWithObjects:[NSArray arrayWithObjects:
                                                                      @"2013-03-27",
                                                                      @"2013-04-04",
                                                                      @"2013-03-27",
                                                                      @"0",
                                                                      @"1",
                                                                      @"1",nil]
                                                             forKeys:[NSArray arrayWithObjects:
                                                                      @"startDate",
                                                                      @"endDate",
                                                                      @"selectedDate",
                                                                      @"shadowsOfID",
                                                                      @"appointmentsOfID",
                                                                      @"shadowType",nil]];


   SBJsonWriter *p = [[SBJsonWriter alloc] init];
        NSString *jsonStr = [NSString stringWithFormat:@"%@",[p stringWithObject:dictionary]];

jsonStr теперь содержит следующее:

"{\"shadowType\":\"1\",\"startDate\":\"2013-03-27\",\"selectedDate\":\"2013-03-27\",\"endDate\":\"2013-04-04\",\"shadowsOfID\":\"0\",\"appointmentsOfID\":\"1\"}";

Обратите внимание, что: Словарь может быть файлом plist в проекте.

person yunas    schedule 27.03.2013