Down-integrate from internal code base.
diff --git a/conformance/ConformanceJava.java b/conformance/ConformanceJava.java
index 25646b8..a983ba3 100644
--- a/conformance/ConformanceJava.java
+++ b/conformance/ConformanceJava.java
@@ -1,9 +1,12 @@
 
 import com.google.protobuf.conformance.Conformance;
+import com.google.protobuf.util.JsonFormat;
+import com.google.protobuf.util.JsonFormat.TypeRegistry;
 import com.google.protobuf.InvalidProtocolBufferException;
 
 class ConformanceJava {
   private int testCount = 0;
+  private TypeRegistry typeRegistry;
 
   private boolean readFromStdin(byte[] buf, int len) throws Exception {
     int ofs = 0;
@@ -29,7 +32,10 @@
     if (!readFromStdin(buf, 4)) {
       return -1;
     }
-    return buf[0] | (buf[1] << 1) | (buf[2] << 2) | (buf[3] << 3);
+    return (buf[0] & 0xff)
+        | ((buf[1] & 0xff) << 8)
+        | ((buf[2] & 0xff) << 16)
+        | ((buf[3] & 0xff) << 24);
   }
 
   private void writeLittleEndianIntToStdout(int val) throws Exception {
@@ -54,7 +60,15 @@
         break;
       }
       case JSON_PAYLOAD: {
-        return Conformance.ConformanceResponse.newBuilder().setSkipped("JSON not yet supported.").build();
+        try {
+          Conformance.TestAllTypes.Builder builder = Conformance.TestAllTypes.newBuilder();
+          JsonFormat.parser().usingTypeRegistry(typeRegistry)
+              .merge(request.getJsonPayload(), builder);
+          testMessage = builder.build();
+        } catch (InvalidProtocolBufferException e) {
+          return Conformance.ConformanceResponse.newBuilder().setParseError(e.getMessage()).build();
+        }
+        break;
       }
       case PAYLOAD_NOT_SET: {
         throw new RuntimeException("Request didn't have payload.");
@@ -73,7 +87,13 @@
         return Conformance.ConformanceResponse.newBuilder().setProtobufPayload(testMessage.toByteString()).build();
 
       case JSON:
-        return Conformance.ConformanceResponse.newBuilder().setSkipped("JSON not yet supported.").build();
+        try {
+          return Conformance.ConformanceResponse.newBuilder().setJsonPayload(
+              JsonFormat.printer().usingTypeRegistry(typeRegistry).print(testMessage)).build();
+        } catch (InvalidProtocolBufferException | IllegalArgumentException e) {
+          return Conformance.ConformanceResponse.newBuilder().setSerializeError(
+              e.getMessage()).build();
+        }
 
       default: {
         throw new RuntimeException("Unexpected request output.");
@@ -106,6 +126,8 @@
   }
 
   public void run() throws Exception {
+    typeRegistry = TypeRegistry.newBuilder().add(
+        Conformance.TestAllTypes.getDescriptor()).build();
     while (doTestIo()) {
       // Empty.
     }