如何在objective-C中反序列化对象

如何在objective-C中反序列化对象,objective-c,wcf,nsmutablearray,generic-list,Objective C,Wcf,Nsmutablearray,Generic List,我试图使wcf方法工作时出错。其中一个参数是NSMutableArray,对象类型是TypeClass。我用NSMutableArray检查了一切,一切都很好 我的参数代码是: NSData *myPostData = [[NSString stringWithFormat:@"{\"parameter1\":\"%@\"}",mynsmutablearraylist] dataUsingEncoding:NSUTF8StringEncoding]; NSMutableData *myMutab

我试图使wcf方法工作时出错。其中一个参数是NSMutableArray,对象类型是TypeClass。我用NSMutableArray检查了一切,一切都很好

我的参数代码是:

NSData *myPostData = [[NSString stringWithFormat:@"{\"parameter1\":\"%@\"}",mynsmutablearraylist] dataUsingEncoding:NSUTF8StringEncoding];
NSMutableData *myMutablePostData = [NSMutableData dataWithData:myPostData];
wcf中的参数类型类似于List

我可以看到mynsmutablearraylist的对象和键的值。但我不明白为什么它不起作用

此wcf方法适用于Win8 metro应用程序,但我无法使其适用于IOS

服务器在处理请求时遇到错误。这个 异常消息是“格式化程序在尝试 反序列化消息:尝试 反序列化参数http://tempuri.org/:typeclass. 这个 InnerException消息为“反序列化 类型的对象 System.Collections.Generic.List`1[[ServiceOfMine.Entities.TypeClass, ServiceOfMine,版本=1.0.0.0,区域性=中性, PublicKeyToken=null]]。遇到无效字符' '.'. 有关详细信息,请参阅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>
> >      ...
>>。。。。
>>面值
>>
> >         
> >         
> >            
> >            
> >            
> >         
> >         
> >            
> >            
> >            
> >         
> >      
> >      ...

根据原始问题的
@“{\”参数1\:\“%@”}”
格式字符串,我假设您正在尝试构建JSON请求。但这可能不是创建JSON请求的最佳方式,所以我的原始答案(如下)集中于如何正确构建JSON请求

但退一步说,至少有三种不同类型的通用web服务接口:

  • JSON,我(可能错误地)根据您的原始问题推断出您想要它,因此我的原始答案如下

  • XML,您修改后的问题表明您可能希望将其用于SOAP请求;或

  • 一些标准HTTP请求(例如
    应用程序/x-www-form-urlencoded
    或其他常见变体)

无论您尝试执行哪种操作,对
NSMutableArray
参数使用
stringWithFormat
、使用
%@
无疑是不正确的

因此,问题恰恰是请求需要什么格式。如您修改后的问题所示,如果您需要创建SOAP请求,您需要手动构建该请求,自己添加XML标记,或者必须使用一些库。如果您正在为Mac OS X执行此操作,请参阅。如果你是为iOS做的,你必须找到一个第三方库。也许这个堆栈溢出问题是一个很好的起点:。或者在堆栈溢出中搜索“
[ios]soap请求
”,您将获得大量其他点击

就我个人而言,当从iOS应用程序测试SOAP服务时,我已经手动构建了请求,但它既笨拙又笨拙。如果您的web服务提供JSON接口,那么这可能是一个更好的选择,因为这是一个具有更大iOS支持的接口

无论如何,下面是我的原始答案,展示了如何为JSON请求构建POST主体


原始答复:

如果没有关于请求完整格式的更多细节,我们不可能得到更具体的信息,但是如果您只是尝试创建一个JSON请求,您将使用
NSJSONSerialization
,而不是
stringWithFormat
,创建该
NSData
,例如,可能会执行以下操作:

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添加更多的参数,你真的应该先将这些参数添加到原始的字典中,然后在你完全构建了你想要的JSON格式的字典/数组结构之后使用
NSJSONSerialization
。例如:

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);

您知道预期数据的格式和实际发送的内容吗?它将返回一个NSString类型的单词。是的,我知道。我用debug检查了很多数据。@user3065761:他没有说数据的类型,他说的是格式。通过执行
[NSString stringWithFormat:@“%@”,someNSMutableArray]
,您可以使用默认的NSArray字符串格式,而不是WCF所期望的格式。例如,NSArray可能会给出一个类似于
(苹果、香蕉、有机柠檬)的字符串
,而WCF可能需要一个类似于
[“苹果”、“香蕉”、“有机柠檬”]
的数组。(我实际上不知道WCF想要什么,但您肯定可以看到有多种方式来格式化列表。)通过您的示例,我对此一无所知:/我在问题中添加了一些信息以帮助您理解。@user3065761我发现下面的语句不清楚:“当我使用完全相同的值测试参数时。”你在Objective-C代码中这么做了?如果是这样,也许您可以向我们展示创建此正确格式请求的代码。现在,我们真的很难推断请求必须采用什么格式,而您的澄清只会让它更加混乱(至少对我来说),因为我不确定如何将您最初的问题(似乎试图创建一个JSON请求)与您修改后的问题中的后续SOAP示例相协调