goprotobuf: Improve and test JSON output of protocol buffers.

This doesn't completely fix issue 18 (we need the `json:"-"` support),
but the vast majority of messages don't carry unrecognized bytes, nor
use extensions, so this gets 99% of the way there.

Fixes #18.

R=r
CC=golang-dev
http://codereview.appspot.com/5167042
diff --git a/compiler/generator/generator.go b/compiler/generator/generator.go
index c26d324..ca1e576 100644
--- a/compiler/generator/generator.go
+++ b/compiler/generator/generator.go
@@ -735,7 +735,6 @@
 	}
 }
 
-
 // FileOf return the FileDescriptor for this FileDescriptorProto.
 func (g *Generator) FileOf(fd *descriptor.FileDescriptorProto) *FileDescriptor {
 	for _, file := range g.allFiles {
@@ -1124,14 +1123,15 @@
 		fieldname := CamelCase(*field.Name)
 		typename, wiretype := g.GoType(message, field)
 		jsonName := *field.Name
-		tag := fmt.Sprintf("`protobuf:%s json:%q`", g.goTag(field, wiretype), jsonName)
+		tag := fmt.Sprintf("`protobuf:%s json:%q`", g.goTag(field, wiretype), jsonName+",omitempty")
 		g.P(fieldname, "\t", typename, "\t", tag)
 		g.RecordTypeUse(proto.GetString(field.TypeName))
 	}
+	// TODO: Use `json:"-"` for these XXX_ fields when that makes it into a Go release.
 	if len(message.ExtensionRange) > 0 {
-		g.P("XXX_extensions\t\tmap[int32]", g.ProtoPkg, ".Extension")
+		g.P("XXX_extensions\t\tmap[int32]", g.ProtoPkg, ".Extension `json:\",omitempty\"`")
 	}
-	g.P("XXX_unrecognized\t[]byte")
+	g.P("XXX_unrecognized\t[]byte `json:\",omitempty\"`")
 	g.Out()
 	g.P("}")