0

Instapaper API にリクエストすると、JSON が返されるはずです。次のように、JSON に近いものを返しますが、完全ではありません。

2013-05-30 19:54:20.155 --[53078:c07] (
        {
        type = meta;
    },
        {
        "subscription_is_active" = 1;
        type = user;
        "user_id" = --;
        username = "--@gmail.com";
    },
        {
        "bookmark_id" = 387838931;
        description = "";
        hash = YHwQuwhW;
        "private_source" = "";
        progress = 0;
        "progress_timestamp" = 0;
        starred = 0;
        time = 1369954406;
        title = "Adobe Finally Releases Kuler Color-Picking App for iPhone - Mac Rumors";
        type = bookmark;
        url = "http://www.macrumors.com/2013/05/30/adobe-finally-releases-kuler-color-picking-app-for-iphone/";
    },

これをどのように処理しますか?有効な JSON ではないように見えますが、取得して NSDictionary に変換できますか?

4

3 に答える 3

2

Instapaper API ドキュメントから:

Instapaper 文字列は常に UTF-8 でエンコードされており、Instapaper はすべての入力が UTF-8 であることを想定しています。特に明記しない限り、すべてのメソッドからの出力は配列です。デフォルトでは、出力配列は JSON として返されます。jsonp=myCallback などのコールバック関数名で jsonp パラメータを指定して、JSONP を使用し、指定された関数への呼び出しで出力をラップすることができます。

したがって、有効でない JSON を取得する方法はありません。

次のコードを試してください:

NSData *jsonData = [[NSString stringWithContentsOfURL:[NSURL urlWithString:@"http://your-instapeper-API-link"] encoding:NSUTF8StringEncoding error:nil] dataUsingEncoding:NSUTF8StringEncoding];
NSError *error;
id serializationJSON = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error];

そして、何が間違っているか、または結果が期待どおりかどうかをログに記録できます。

NSLog(@"class of JSON input: %@ \n and possible error: %@",[serializationJSON class],error);

もちろん、配列とエラーなしを期待する必要があります。

EDIT ...コメントコードに基づいて:

ドキュメントに基づいて、Array または Dictionary を取得する必要があります。行番号 23 の代わりにこのコアを追加してください (ここからの番号):

if([JSON isKindOfClass:[NSDictionary class]]) {
   NSDictionary *jsonDictionary = JSON;
   NSLog(@"%@",[jsonDictionary allKeys]);
} else { 
  NSLog(@"JSON object class: %@",[JSON class]);
}

出力を見せてください。

もう一つ:

リクエストから配列を取得します。すごい!これは有効な JSON です。したがって、デバッグする必要があります。私が言ったように、それは無制限のアクセスパブリック API ではないので、調べることができます。しかし、ここで結果をデバッグする必要があります。ブックマークにアクセスしようとしていることがコードでわかります。だから私はドキュメントのブックマークセクションを見て、これはある種のリスト(NSArray)です。したがって、どのような結果が必要なのかわからない場合。それらをログに出力する (またはブレークポイントを設定する) 必要があります。以前の更新のコードを次の単純なログに置き換えます。

NSDictionary *resultDictionary;
if([JSON isKindOfClass:[NSArray class]]) {
  NSArray *jsonArray = JSON;
  NSLog(@"so json is an array with %i objects",[jsonArray count]);
  for(id objectInsideArr in jsonArray) {
     NSLog(@"object in array [class]: %@ [value]: %@",[objectInsideArr class],objectInsideArr); //if here you find NSDictionary maybe is this dictionary you are looking for. I'm not sure what it is.
   if([objectInsideArr isKindOfClass:[NSDictionary class]]) {
       resultDictionary = [[NSDictionary alloc] initWithDictionary:objectInsideArr];
   }
  }
}
于 2013-06-05T10:50:14.503 に答える
-1

私だったら、カスタム フォーマッタを作成して JSON 形式にし、それが有効であることを確認したら NSJSONSerialization を使用します。あなたが投稿したものは有効とはほど遠いものであり、機能する方法はありません。彼らがその形式でそれを返していることに驚いています。彼らはサービスを利用するためのある種のライブラリを提供していますか?

于 2013-06-04T14:37:17.337 に答える
-1

さらに単純なものが必要な場合は、CGIJSONObjectリフレクションを使用して JSON を処理するライブラリを提供できます。クラスで API のキーをミラーリングするだけでよいのです。

于 2013-06-08T09:56:48.147 に答える