2013-12-17 3 views
-1

У меня возникла ошибка, когда я пытаюсь работать с wcf-методом. Одним из параметров является NSMutableArray, а Тип объекта - TypeClass. Я проверил все с помощью NSMutableArray, и все кажется прекрасным.Как де-сериализовать объект в объекте-C

Мой код для параметра:

NSData *myPostData = [[NSString stringWithFormat:@"{\"parameter1\":\"%@\"}",mynsmutablearraylist] dataUsingEncoding:NSUTF8StringEncoding]; 
NSMutableData *myMutablePostData = [NSMutableData dataWithData:myPostData]; 

Тип параметра в ФОС как список < класса типов>.

Я могу видеть значения объекта и ключей mynsmutablearraylist. Но я не понимаю, почему это не работает.

Этот метод wcf работает для приложения станции метро Win8, но я не могу заставить его работать для IOS.

На сервере возникла ошибка при обработке запроса. Сообщение об ошибке : «Форматирование выдало исключение при попытке десериализовать сообщение: при попытке указать параметр deserialize http://tempuri.org/:typeclass. InnerException сообщение было «Там было ошибкой десериализации объект типа System.Collections.Generic.List`1 [[ServiceOfMine.Entities.TypeClass, ServiceOfMine, Version = 1.0.0.0, культура = нейтральной, PublicKeyToken = ноль]]. Обнаружен недопустимый символ ' '. '. Дополнительную информацию см. В InnerException. '. Для получения более подробной информации см. Журналы сервера . Стек исключение трассировки:

Добавлена ​​информация:

Когда я проверить параметры с точно такими же значениями, она отлично работает. Часть запроса в SoapUI:

> >.... 
> >  <tem: parameter4>parvalue</tem: parameter4> 
> >  < tem: typeclass> 
> >   <!--Zero or more repetitions:--> 
> >   <ser:TypeClass> 
> >    
> >   <ser:drugId></ser:drugId> 
> >   <ser:drugname></ser:drugname> 
> >   </ser:TypeClass> 
> >   <ser:TypeClass> 
> >    
> >   <ser:drugId></ser:drugId> 
> >   <ser:drugname></ser:drugname> 
> >   </ser:TypeClass> 
> >  </ tem: typeclass> 
> >  ... 
+0

Знаете ли вы формат ожидаемых данных и то, что вы действительно отправляете? – Wain

+0

Он вернет слово с типом NSString. Да, я знаю это. Я проверил их с отладкой. – user3065761

+1

@ user3065761: Он не сказал * тип * данных, он сказал * формат *. Выполняя '[NSString stringWithFormat: @"% @ ", someNSMutableArray]', вы используете форматирование строки NSArray по умолчанию, а не формат, который ожидает WCF. Например, NSArray может дать строку, которая выглядит как «(яблоко, банан,« органический лимон »)», хотя, возможно, WCF ожидает массив, который выглядит как «[» яблоко »,« банан »,« органический лимон »] '. (Я действительно не знаю, чего хочет WCF, но, конечно же, вы можете видеть, что есть несколько способов форматирования списка вещей.) – Chuck

ответ

2

На основе @"{\"parameter1\":\"%@\"}" форматной строки своего вопроса, я предположил, что вы пытаетесь построить запрос JSON. Но, вероятно, это не лучший способ создать запрос JSON, поэтому в моем первоначальном ответе (см. Ниже) основное внимание уделялось тому, как правильно создавать этот запрос JSON.

Но шаг назад, есть по крайней мере три различных типа интерфейсов общего веб-служб:

  • JSON, который я (возможно, ошибочно), выведенный вы хотите на основе оригинального вопроса, следовательно, мой исходный ответ ниже;

  • XML, в котором ваш пересмотренный вопрос предполагает, что вы захотите выполнить запрос SOAP; или

  • некоторый стандартный HTTP-запрос (например, application/x-www-form-urlencoded или другие распространенные варианты).

Независимо от того, какой из них вы пытаетесь сделать, используя stringWithFormat, используя %@ для параметра NSMutableArray, несомненно, является неверным.

Итак, вопрос в том, какой формат требуется запросу.Если, как следует из вашего пересмотренного вопроса, вам нужно создать запрос SOAP, вам либо нужно собрать его вручную, либо добавить теги XML самостоятельно, либо вам придется использовать некоторую библиотеку. Если вы делаете это для Mac OS X, см. Web Services Core Programming Guide. Если вы делаете для iOS, вам придется найти стороннюю библиотеку. Возможно, этот вопрос переполнения стека является хорошим стартовым местом: How to access SOAP services from iPhone. Или найдите «Переполнение стека» для «[ios] soap request», и вы получите много других хитов.

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

В любом случае, мой первоначальный ответ, показывающий, как построить тело POST для запроса JSON, приведен ниже.


Оригинальный ответ:

Это невозможно для нас, чтобы получить более конкретные без получения более подробной информации о полном формате запроса, но если вы просто пытаетесь создать запрос JSON, вы бы создать что NSData с использованием NSJSONSerialization, а не stringWithFormat, например вероятно, сделать что-то вроде:

NSDictionary *dictionary = @{@"parameter1": mynsmutablearraylist, 
          @"parameter2": someOtherObject}; 
NSError *error = nil; 
NSData *postData = [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:&error]; 
NSAssert(postData, @"%s: dataWithJSONObject error: %@", __FUNCTION__, error); 

Вы также относитесь к «объектам и ключам mynsmutablearraylist», но я запутался по имени (что предполагает, что св NSMutableArray и вашей ссылка на «объекты и ключи «). Но я предполагаю, что это были словари массива, и в этом случае этот синтаксис все еще работает. Но, опять же, трудно сказать, не зная точно, что ищет ваш сервис.

Я также не понимаю, почему вы создаете NSMutableData исполнение, но если вы пытаетесь добавить больше параметров для этого JSON, вы действительно должны добавить их к исходному словарю первым, а затем использовать NSJSONSerialization как только вы» ve полностью построил вашу структуру словаря/массива, которую вы хотите в формате JSON. Например:

NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; 
[dictionary setObject:mynsmutablearraylist forKey:@"parameter1"]; 
[dictionary setObject:someOtherObject  forKey:@"parameter2"]; 
// ... repeat for all of the objects in the dictionary 

NSError *error = nil; 
NSData *postData = [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:&error]; 
NSAssert(postData, @"%s: dataWithJSONObject error: %@", __FUNCTION__, error); 
+0

Возможно, проблема заключается в том, что я пытаюсь преобразовать NSMutableArray в NSString? – user3065761

+0

@ user3065761 Да, использование 'stringWithFormat' с вашим' NSMutableArray', безусловно, не сработает. Должен признаться, что теперь я совершенно неясен в отношении того, что вам нужно, поскольку ваш первоначальный вопрос предложил запрос JSON, но ваша ревизия предполагает интерфейс SOAP.Во всяком случае, я пересмотрел свой ответ, чтобы расширить некоторые из этих пунктов. – Rob

+0

Это была давняя причина для других проблем с кодированием, но я заработал. Спасибо, @Rob. Я создал NSMutableDictionary для dataWithJSONObject. И я использовал NSDictionarys и NSMutableDictionarys внутри NSMutableDictionary для вспомогательных элементов. – user3065761

 Смежные вопросы

  • Нет связанных вопросов^_^