3

文字列をjsonオブジェクトとして配置する必要がある割り当てがあり、オブジェクトを送信する前に、このjsonオブジェクトをhttpヘッダーに配置する必要があります。これは私のコードです:

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSString *nid = @"";
    NSString *vocab = @"";
    NSString *inturl = @"testoverview";
    NSString *mail = @"chh@fbr.dk";
    NSString *md5pw = @"4d57e7ef1b7c3f431aca424764e9d786";

    NSDictionary *jsonDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                                    nid, @"nid", 
                                    vocab, @"vocab",
                                    inturl, @"inturl",
                                    mail, @"mail",
                                    md5pw, @"md5pw",nil];


    NSString *json = @"{nid:"",vocab:"",inturl:testoverview, mail:chh@fbr.dk, md5pw:4d57e7ef1b7c3f431aca424764e9d786}";


    NSError *error;



    NSString *url = @"http://udv.taenk.dk/chh/drupal-taenk/services/mobile";


    NSData *data = [json dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];

    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonDictionary options:NSJSONWritingPrettyPrinted error:&error];


    NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLCacheStorageAllowed timeoutInterval:30.0];

     NSURLConnection *connction = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    FSRemoteExecutor *remote = [[FSRemoteExecutor alloc] init];
    [remote execute:url andHandler:[FSProductTestHandler alloc] JSONString:jsonString JSONData:jsonData Connection:connction];
    [remote connection:connction didReceiveData:jsonData];
    [remote connectionFinishedLoading:connction];

私の問題は、オブジェクトでjsonDictionaryを使用して送信できないことです。サービスが受信する必要のある文字列形式は、次のとおりです。

"{" nid ":" "、" vocab ":" "、" inturl ":" testoverview "、" mail ":" "、" md5pw ":" "}"

辞書は文字列に=を挿入しますが、それではサービスからの応答はありません。

文字列(コード内のjson)をdataWithJSONObject:jsoとして送信したいのですが、次のようになります。

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:json options:NSJSONWritingPrettyPrinted error:&error];

しかし、私はこれを満足させるエラーが発生します:

キャッチされなかった例外'NSInvalidArgumentException'が原因でアプリを終了しています、理由:'* + [NSJSONSerialization dataWithJSONObject:options:error:]:JSON書き込みの最上位タイプが無効です'

誰かがこれで私を助けることができますか?

4

2 に答える 2

12

しかし、なぜ使用するNSJSONSerializationのですか?独自の JSON 文字列を作成しました ( NSString *json = @"{nid:"",vocab:"",inturl:testoverview, mail:chh@fbr.dk, md5pw:4d57e7ef1b7c3f431aca424764e9d786}";)。その後、再度実行する必要はありませんNSJSONSerialization

から NSData を作成し、*json (NSString)それをサーバーに送信するだけです。

NSData を次のようにします。

NSData *jsonPayload = [json dataUsingEncoding:NSUTF8StringEncoding];
于 2012-04-20T10:23:53.017 に答える
4

まず、文字列jsonに含まれていると思われる引用符が含まれていません。文字列を終了しないようにするには、文字列内の引用符をバックスラッシュで「エスケープ」する必要があります。あなたの行:

NSString *json = @"{nid:"",vocab:"",inturl:testoverview, mail:chh@fbr.dk, md5pw:4d57e7ef1b7c3f431aca424764e9d786}";

次のように解析されています。

NSString *json = @"{nid:"
                 ",vocab:"
                 ",inturl:testoverview, mail:chh@fbr.dk, md5pw:4d57e7ef1b7c3f431aca424764e9d786}";

つまり、引用符で囲まれた 3 つの文字列が連続しています。コンパイラは隣接する文字列リテラルを連結します。したがって、効果は次のとおりです。

NSString *json = @"{nid:,vocab:,inturl:testoverview, mail:chh@fbr.dk, md5pw:4d57e7ef1b7c3f431aca424764e9d786}";

引用符文字が埋め込まれていません。

あなたが書きたかったのは:

NSString *json = @"{nid:\"\",vocab:\"\",inturl:testoverview, mail:chh@fbr.dk, md5pw:4d57e7ef1b7c3f431aca424764e9d786}";

次の出力を表示できますか:

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonDictionary options:NSJSONWritingPrettyPrinted error:&error];

「=」文字を取得する場所がわかりません。


アップデート:

このコード(質問から変更):

NSString *nid = @"";
NSString *vocab = @"";
NSString *inturl = @"testoverview";
NSString *mail = @"chh@fbr.dk";
NSString *md5pw = @"4d57e7ef1b7c3f431aca424764e9d786";

NSDictionary *jsonDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                                nid, @"nid", 
                                vocab, @"vocab",
                                inturl, @"inturl",
                                mail, @"mail",
                                md5pw, @"md5pw",nil];

NSError *error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonDictionary options:NSJSONWritingPrettyPrinted error:&error];
NSString *resultAsString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSLog(@"jsonData as string:\n%@", resultAsString);

次の出力が得られます。

jsonData as string:
{
  "md5pw" : "4d57e7ef1b7c3f431aca424764e9d786",
  "nid" : "",
  "inturl" : "testoverview",
  "mail" : "chh@fbr.dk",
  "vocab" : ""
}

0の代わりに使用すると、次のNSJSONWritingPrettyPrintedようになります。

jsonData as string:
{"md5pw":"4d57e7ef1b7c3f431aca424764e9d786","nid":"","inturl":"testoverview","mail":"chh@fbr.dk","vocab":""}
于 2012-04-20T10:24:08.773 に答える