18

昨夜、TouchJSON を使っていくつかのテストを行いましたが、単純なケースでは一般的にうまく機能しました。次のコードを使用して、ファイルから JSON コンテンツを読み取り、逆シリアル化しています。

NSString *jsonString = [[NSString alloc] initWithContentsOfFile:@"data.json"];
NSData *jsonData = [jsonString dataUsingEncoding:NSUTF32BigEndianStringEncoding];
NSError *error = nil;
NSDictionary *items = [[CJSONDeserializer deserializer] deserializeAsDictionary:jsonData error:&error];
NSLog(@"total items: %d", [items count]);
NSLog(@"error: %@", [error localizedDescription]);

ファイルに非常に単純な JSON オブジェクト (つまり、辞書) がある場合、これは問題なく機能します。

{"id": "54354", "name": "boohoo"}

リスト内のインデックスに基づいてアイテムを取得したかったので、この方法で値の配列にアクセスできました。

NSArray *items_list = [items allValues];
NSString *name = [items_list objectAtIndex:1];

(辞書 API で名前を取得できたことは理解しています)

ここで、辞書の配列を表す半複雑な JSON 文字列を逆シリアル化したいと思います。このような JSON 文字列の例を以下に示します。

[{"id": "123456", "name": "touchjson"}, {"id": "3456", "name": "bleh"}]

data.json ファイルのこの新しいコンテンツに対して上記と同じコードを実行しようとすると、結果が返されません。私の NSLog() 呼び出しは「合計アイテム: 0」と言い、NSError オブジェクトにエラーは返されません。

何が起こっているのかについての手がかりはありますか?TouchJSON に関するドキュメントがあまりなく、使用例も少ないため、何をすべきか完全に迷っています。

4

5 に答える 5

12

私は TouchJSON の作成者です。

最も外側のオブジェクトは辞書であり、配列ではありません。辞書以外のものは合法ではありません。配列を最も外側のオブジェクトとして持つ必要がある場合は、メソッドを使用します (これは技術的に非推奨ですが、すぐには使用されません)。

- (id)deserialize:(NSData *)inData error:(NSError **)outError;

参照: http://www.json.com/json-schema-proposal/の詳細については、正当な JSON とそうでないものについての情報を参照してください。

于 2008-11-14T03:50:43.710 に答える
8

これは答えではありませんが、別のフレームワークへのポインタです。

http://code.google.com/p/json-framework/

私は最近これをかなり使用しており、Google Local などのサードパーティ サービスから複雑なデータ構造をシリアライズおよびデシリアライズし、独自の Objective-C と Perl コード間でまったく問題なく使用しています。API の扱いが驚くほど簡単であることは言うまでもありません。

幸運を!

于 2008-11-14T00:15:36.720 に答える
0

@Mathieu-これはあなたが探しているものだと思います(6か月遅れ、私は知っています:)が、同じ問題に遭遇しました)

ここからコピーして貼り付けます: http://groups.google.com/group/touchcode-dev/browse_thread/thread/ada885832019f45b

NSArray *tweetsArray = [resultsDictionary objectForKey:@"results"]; 
for (NSDictionary *tweetDictionary in tweetsArray) { 
  NSString *tweetText = [tweetDictionary objectForKey:@"text"]; 
  [tweets addObject:tweetText]; 
} 

より多くのコンテキストを提供するために、私が解析している JSON は次の一般的な形式
です。

{"results": 
   [ 
     {"text":"tweet1"}, 
     {"text":"tweet2"}, 
     {"text":"tweet3"} 
   ] 
} 
于 2009-06-05T07:53:30.603 に答える
0

それがあなたに役立つかどうかはわかりませんが、これをチェックしてください http://tempered.mobi/%20

于 2010-05-09T23:41:04.020 に答える
0

本質的に、JSON はオブジェクトを扱います。逆シリアル化するコードは次のようになります。

{
  "objects": [{
    "id": "123456",
    "name": "touchjson"
  }, {
    "id": "3456",
    "name": "bleh"
  }]
}

これは最新のチェックアウトで動作します。

于 2008-11-14T03:40:56.803 に答える