diff -ur Flickr-API-0.09/lib/Flickr/API/Response.pm Flickr-API-0.09-json/lib/Flickr/API/Response.pm
--- Flickr-API-0.09/lib/Flickr/API/Response.pm	2005-07-11 22:30:05.000000000 +0100
+++ Flickr-API-0.09-json/lib/Flickr/API/Response.pm	2008-05-26 20:35:38.000000000 +0100
@@ -37,6 +37,12 @@
 	$self->{tree} = $tree;
 }
 
+sub set_ok_json {
+	my ($self, $obj) = @_;
+	$self->{success} = 1;
+	$self->{obj} = $obj;
+}
+
 1;
 
 __END__
diff -ur Flickr-API-0.09/lib/Flickr/API.pm Flickr-API-0.09-json/lib/Flickr/API.pm
--- Flickr-API-0.09/lib/Flickr/API.pm	2008-02-05 18:00:53.000000000 +0000
+++ Flickr-API-0.09-json/lib/Flickr/API.pm	2008-05-26 20:41:37.000000000 +0100
@@ -4,6 +4,7 @@
 use warnings;
 use LWP::UserAgent;
 use XML::Parser::Lite::Tree;
+use JSON::Any;
 use Flickr::API::Request;
 use Flickr::API::Response;
 use Digest::MD5 qw(md5_hex);
@@ -82,9 +83,13 @@
 sub execute_request {
 	my ($self, $request) = @_;
 
+  my $format = $request->{api_args}->{'format'} || "xml";
+
 	$request->{api_args}->{method}  = $request->{api_method};
 	$request->{api_args}->{api_key} = $self->{api_key};
 
+  $request->{api_args}->{nojsoncallback}  = 1 if $format eq 'json';
+	
 	if (defined($self->{api_secret}) && length($self->{api_secret})){
 
 		$request->{api_args}->{api_sig} = $self->sign_args($request->{api_args});
@@ -102,32 +107,63 @@
 		return $response;
 	}
 
-	my $tree = XML::Parser::Lite::Tree::instance()->parse($response->decoded_content());
-
-	my $rsp_node = $self->_find_tag($tree->{children});
-
-	if ($rsp_node->{name} ne 'rsp'){
-		$response->set_fail(0, "API returned an invalid response");
-		return $response;
-	}
-
-	if ($rsp_node->{attributes}->{stat} eq 'fail'){
-		my $fail_node = $self->_find_tag($rsp_node->{children});
-		if ($fail_node->{name} eq 'err'){
-			$response->set_fail($fail_node->{attributes}->{code}, $fail_node->{attributes}->{msg});
-		}else{
-			$response->set_fail(0, "Method failed but returned no error code");
-		}
-		return $response;
-	}
+  if ($format ne 'json') {
+    my $tree = XML::Parser::Lite::Tree::instance()->parse($response->decoded_content());
+    
+    print $response->decoded_content()."\n\n";
+    my $rsp_node = $self->_find_tag($tree->{children});
+  
+    if ($rsp_node->{name} ne 'rsp'){
+      $response->set_fail(0, "API returned an invalid response");
+      return $response;
+    }
+  
+    if ($rsp_node->{attributes}->{stat} eq 'fail'){
+      my $fail_node = $self->_find_tag($rsp_node->{children});
+      if ($fail_node->{name} eq 'err'){
+        $response->set_fail($fail_node->{attributes}->{code}, $fail_node->{attributes}->{msg});
+      }else{
+        $response->set_fail(0, "Method failed but returned no error code");
+      }
+      return $response;
+    }
+  
+    if ($rsp_node->{attributes}->{stat} eq 'ok'){
+      $response->set_ok($rsp_node);
+      return $response;
+    }
+  
+    $response->set_fail(0, "API returned an invalid status code");
+    return $response;
 
-	if ($rsp_node->{attributes}->{stat} eq 'ok'){
-		$response->set_ok($rsp_node);
-		return $response;
-	}
+  } else {
+    my $j = JSON::Any->new;
+    print $response->decoded_content()."\n\n";
+    my $obj = $j->from_json($response->decoded_content());
+
+    if (!$obj){
+      $response->set_fail(0, "API returned an invalid response");
+      return $response;
+    }
+
+    if ($obj->{stat} eq 'fail'){
+      if ($obj->{code}){
+        $response->set_fail($obj->{code}, $obj->{message});
+      }else{
+        $response->set_fail(0, "Method failed but returned no error code");
+      }
+      return $response;
+    }
+
+    if ($obj->{stat} eq 'ok'){
+      $response->set_ok_json($obj);
+      return $response;
+    }
+
+    $response->set_fail(0, "API returned an invalid status code");
+    return $response;
+  }
 
-	$response->set_fail(0, "API returned an invalid status code");
-	return $response;
 }
 
 sub _find_tag {
diff -ur Flickr-API-0.09/test.pl Flickr-API-0.09-json/test.pl
--- Flickr-API-0.09/test.pl	2006-03-19 20:17:14.000000000 +0000
+++ Flickr-API-0.09-json/test.pl	2008-05-26 20:26:12.000000000 +0100
@@ -1,5 +1,5 @@
 use Test::More;
-BEGIN { plan tests => 17 };
+BEGIN { plan tests => 18 };
 
 BEGIN { use_ok( 'Flickr::API' ); }
 
@@ -85,3 +85,20 @@
 
 ok(!defined $uri, "Checking URL generation without a secret");
 
+##################################################
+#
+# repeat tests using the JSON format
+#
+
+my $rsp = $api->execute_method('fake.method', {'format' => 'json'});
+
+
+##################################################
+#
+# check we get the 'method not found' error
+#
+
+# this error code will change in future!
+is($rsp->{error_code}, 112, 'checking the error code for "method not found" via JSON');
+
+# "code was $rsp->{error_code}, msg was $rsp->{error_message}\n";
