You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by sp...@apache.org on 2017/07/02 21:51:53 UTC

tinkerpop git commit: TINKERPOP-1427 Added g:Set and g:List for GraphSON 3.0

Repository: tinkerpop
Updated Branches:
  refs/heads/TINKERPOP-1427 70dcc15e4 -> 3c241bca0


TINKERPOP-1427 Added g:Set and g:List for GraphSON 3.0


Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/3c241bca
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/3c241bca
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/3c241bca

Branch: refs/heads/TINKERPOP-1427
Commit: 3c241bca08aed29c5d671fd5333e4ea99307ab70
Parents: 70dcc15
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Sun Jul 2 17:51:18 2017 -0400
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Sun Jul 2 17:51:18 2017 -0400

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |   2 +-
 .../structure/io/graphson/GraphSONModule.java   |   8 +
 .../io/graphson/GraphSONSerializersV3d0.java    |  20 +-
 .../io/graphson/GraphSONTypeSerializerV3d0.java |  26 +++
 .../io/graphson/JavaUtilSerializersV3d0.java    |  83 +++++++++
 .../GraphSONMapperEmbeddedTypeTest.java         |  42 ++++-
 .../GremlinServerAuditLogIntegrateTest.java     |   3 +-
 .../server/GremlinServerHttpIntegrateTest.java  |  77 ++++----
 .../io/graphson/_3_3_0/metrics-v3d0.json        |  49 ++---
 .../structure/io/graphson/_3_3_0/path-v3d0.json |  73 +++++---
 .../io/graphson/_3_3_0/standardresult-v3d0.json | 179 +++++++++---------
 .../graphson/_3_3_0/traversalmetrics-v3d0.json  | 181 ++++++++++---------
 12 files changed, 464 insertions(+), 279 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/3c241bca/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 956a725..21e498b 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -34,7 +34,7 @@ TinkerPop 3.3.0 (Release Date: NOT OFFICIALLY RELEASED YET)
 * Updated Docker build scripts to include Python dependencies (NOTE: users should remove any previously generated TinkerPop Docker images).
 * Added "attachment requisite" `VertexProperty.element()` and `Property.element()` data in GraphSON serialization.
 * GraphSON 3.0 is now the default serialization format in TinkerGraph and Gremlin Server.
-* Established the GraphSON 3.0 format.
+* Established the GraphSON 3.0 format with new `g:Map`, `g:List` and `g:Set` types.
 * Removed previously deprecated `Io.Builder#registry(IoRegistry)` method.
 * Removed previously deprecated `GryoMessageSerializerV1d0(GryoMapper)` constructor.
 * Removed previously deprecated `TinkerIoRegistry`.

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/3c241bca/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java
index 22dc6b2..00bec01 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java
@@ -90,7 +90,9 @@ import java.time.ZonedDateTime;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.LinkedHashMap;
+import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.stream.Stream;
 
 /**
@@ -125,6 +127,8 @@ abstract class GraphSONModule extends TinkerPopJacksonModule {
 
                     put(Map.Entry.class, "Entry");
                     put(Map.class, "Map");
+                    put(List.class, "List");
+                    put(Set.class, "Set");
 
                     // Tinkerpop Graph objects
                     put(Lambda.class, "Lambda");
@@ -206,6 +210,8 @@ abstract class GraphSONModule extends TinkerPopJacksonModule {
             // java.util
             addSerializer(Map.Entry.class, new JavaUtilSerializersV3d0.MapEntryJacksonSerializer());
             addSerializer(Map.class, new JavaUtilSerializersV3d0.MapJacksonSerializer());
+            addSerializer(List.class, new JavaUtilSerializersV3d0.ListJacksonSerializer());
+            addSerializer(Set.class, new JavaUtilSerializersV3d0.SetJacksonSerializer());
 
             // need to explicitly add serializers for those types because Jackson doesn't do it at all.
             addSerializer(Integer.class, new GraphSONSerializersV3d0.IntegerGraphSONSerializer());
@@ -245,6 +251,8 @@ abstract class GraphSONModule extends TinkerPopJacksonModule {
             // java.util
             addDeserializer(Map.Entry.class, new JavaUtilSerializersV3d0.MapEntryJacksonDeserializer());
             addDeserializer(Map.class, new JavaUtilSerializersV3d0.MapJacksonDeserializer());
+            addDeserializer(List.class, new JavaUtilSerializersV3d0.ListJacksonDeserializer());
+            addDeserializer(Set.class, new JavaUtilSerializersV3d0.SetJacksonDeserializer());
 
             // numbers
             addDeserializer(Integer.class, new GraphSONSerializersV3d0.IntegerJackonsDeserializer());

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/3c241bca/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONSerializersV3d0.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONSerializersV3d0.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONSerializersV3d0.java
index 5fe8e74..8c601b1 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONSerializersV3d0.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONSerializersV3d0.java
@@ -547,18 +547,22 @@ class GraphSONSerializersV3d0 {
 
         @Override
         public Path deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
-            final JsonNode n = jsonParser.readValueAsTree();
             final Path p = MutablePath.make();
 
-            final ArrayNode labels = (ArrayNode) n.get(GraphSONTokens.LABELS);
-            final ArrayNode objects = (ArrayNode) n.get(GraphSONTokens.OBJECTS);
+            List<Object> labels = new ArrayList<>();
+            List<Object> objects = new ArrayList<>();
+            while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
+                if (jsonParser.getCurrentName().equals(GraphSONTokens.LABELS)) {
+                    jsonParser.nextToken();
+                    labels = deserializationContext.readValue(jsonParser, List.class);
+                } else if (jsonParser.getCurrentName().equals(GraphSONTokens.OBJECTS)) {
+                    jsonParser.nextToken();
+                    objects = deserializationContext.readValue(jsonParser, List.class);
+                }
+            }
 
             for (int i = 0; i < objects.size(); i++) {
-                final JsonParser po = objects.get(i).traverse();
-                po.nextToken();
-                final JsonParser pl = labels.get(i).traverse();
-                pl.nextToken();
-                p.extend(deserializationContext.readValue(po, Object.class), deserializationContext.readValue(pl, setType));
+                p.extend(objects.get(i), (Set<String>) labels.get(i));
             }
 
             return p;

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/3c241bca/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTypeSerializerV3d0.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTypeSerializerV3d0.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTypeSerializerV3d0.java
index 246d38f..f3b7afa 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTypeSerializerV3d0.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTypeSerializerV3d0.java
@@ -42,7 +42,9 @@ import org.apache.tinkerpop.shaded.jackson.databind.jsontype.TypeIdResolver;
 import java.io.IOException;
 import java.net.InetAddress;
 import java.nio.ByteBuffer;
+import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * GraphSON 2.0 {@code TypeSerializer}.
@@ -78,6 +80,26 @@ public class GraphSONTypeSerializerV3d0 extends AbstractGraphSONTypeSerializer {
     }
 
     @Override
+    public void writeTypePrefixForArray(final Object o, final JsonGenerator jsonGenerator) throws IOException {
+        if (o instanceof List || o instanceof Set) {
+            writeTypePrefix(jsonGenerator, getTypeIdResolver().idFromValueAndType(o, getClassFromObject(o)));
+            jsonGenerator.writeStartArray();
+        } else {
+            jsonGenerator.writeStartArray();
+        }
+    }
+
+    @Override
+    public void writeTypeSuffixForArray(final Object o, final JsonGenerator jsonGenerator) throws IOException {
+        if (o instanceof List || o instanceof Set) {
+            jsonGenerator.writeEndArray();
+            writeTypeSuffix(jsonGenerator);
+        } else {
+            jsonGenerator.writeEndArray();
+        }
+    }
+
+    @Override
     protected Class getClassFromObject(final Object o) {
         final Class c = o.getClass();
         if (classMap.containsKey(c))
@@ -88,6 +110,10 @@ public class GraphSONTypeSerializerV3d0 extends AbstractGraphSONTypeSerializer {
             mapped = Map.class;
         else if (Map.Entry.class.isAssignableFrom(c))
             mapped = Map.Entry.class;
+        else if (List.class.isAssignableFrom(c))
+            mapped = List.class;
+        else if (Set.class.isAssignableFrom(c))
+            mapped = Set.class;
         else if (Vertex.class.isAssignableFrom(c))
             mapped = Vertex.class;
         else if (Edge.class.isAssignableFrom(c))

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/3c241bca/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/JavaUtilSerializersV3d0.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/JavaUtilSerializersV3d0.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/JavaUtilSerializersV3d0.java
index 900eeb8..8298ce7 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/JavaUtilSerializersV3d0.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/JavaUtilSerializersV3d0.java
@@ -32,6 +32,9 @@ import org.apache.tinkerpop.shaded.jackson.databind.ser.std.StdSerializer;
 import java.io.IOException;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -89,6 +92,50 @@ final class JavaUtilSerializersV3d0 {
         }
     }
 
+    final static class SetJacksonSerializer extends StdSerializer<Set> {
+        public SetJacksonSerializer() {
+            super(Set.class);
+        }
+
+        @Override
+        public void serialize(final Set set, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider)
+                throws IOException {
+            for(Object o : set) {
+                jsonGenerator.writeObject(o);
+            }
+        }
+
+        @Override
+        public void serializeWithType(final Set set, final JsonGenerator jsonGenerator,
+                                      final SerializerProvider serializerProvider, final TypeSerializer typeSerializer) throws IOException {
+            typeSerializer.writeTypePrefixForArray(set, jsonGenerator);
+            serialize(set, jsonGenerator, serializerProvider);
+            typeSerializer.writeTypeSuffixForArray(set, jsonGenerator);
+        }
+    }
+
+    final static class ListJacksonSerializer extends StdSerializer<List> {
+        public ListJacksonSerializer() {
+            super(List.class);
+        }
+
+        @Override
+        public void serialize(final List list, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider)
+                throws IOException {
+            for(Object o : list) {
+                jsonGenerator.writeObject(o);
+            }
+        }
+
+        @Override
+        public void serializeWithType(final List list, final JsonGenerator jsonGenerator,
+                                      final SerializerProvider serializerProvider, final TypeSerializer typeSerializer) throws IOException {
+            typeSerializer.writeTypePrefixForArray(list, jsonGenerator);
+            serialize(list, jsonGenerator, serializerProvider);
+            typeSerializer.writeTypeSuffixForArray(list, jsonGenerator);
+        }
+    }
+
     ////////////////////////////// DESERIALIZERS /////////////////////////////////
 
 
@@ -133,4 +180,40 @@ final class JavaUtilSerializersV3d0 {
             return m.entrySet().iterator().next();
         }
     }
+
+    static class SetJacksonDeserializer extends StdDeserializer<Set> {
+
+        protected SetJacksonDeserializer() {
+            super(Set.class);
+        }
+
+        @Override
+        public Set deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
+            final Set<Object> s = new LinkedHashSet<>();
+
+            while (jsonParser.nextToken() != JsonToken.END_ARRAY) {
+                s.add(deserializationContext.readValue(jsonParser, Object.class));
+            }
+
+            return s;
+        }
+    }
+
+    static class ListJacksonDeserializer extends StdDeserializer<List> {
+
+        protected ListJacksonDeserializer() {
+            super(List.class);
+        }
+
+        @Override
+        public List deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
+            final List<Object> s = new LinkedList<>();
+
+            while (jsonParser.nextToken() != JsonToken.END_ARRAY) {
+                s.add(deserializationContext.readValue(jsonParser, Object.class));
+            }
+
+            return s;
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/3c241bca/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperEmbeddedTypeTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperEmbeddedTypeTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperEmbeddedTypeTest.java
index eaf12cf..97a9485 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperEmbeddedTypeTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperEmbeddedTypeTest.java
@@ -42,10 +42,15 @@ import java.time.Year;
 import java.time.YearMonth;
 import java.time.ZoneOffset;
 import java.time.ZonedDateTime;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import static org.hamcrest.CoreMatchers.any;
 import static org.hamcrest.Matchers.either;
@@ -83,7 +88,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest {
     public void shouldHandleMap() throws Exception {
         assumeThat(version, startsWith("v3"));
 
-        final Map<Object,Object> o = new HashMap<>();
+        final Map<Object,Object> o = new LinkedHashMap<>();
         o.put("string key", "string value");
         o.put(1, 1);
         o.put(1L, 1L);
@@ -95,6 +100,41 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest {
     }
 
     @Test
+    public void shouldHandleList() throws Exception {
+        assumeThat(version, startsWith("v3"));
+
+        final List<Object> o = new ArrayList<>();
+        o.add("test");
+        o.add(1);
+        o.add(1);
+        o.add(1L);
+        o.add(1L);
+
+        final List<Object> l = Arrays.asList("test", 1, 5L);
+        o.add(l);
+
+        assertEquals(o, serializeDeserialize(mapper, o, List.class));
+    }
+
+    @Test
+    public void shouldHandleSet() throws Exception {
+        assumeThat(version, startsWith("v3"));
+
+        final Set<Object> o = new LinkedHashSet<>();
+        o.add("test");
+        o.add(1);
+        o.add(1);
+        o.add(1L);
+        o.add(1L);
+
+        final List<Object> l = Arrays.asList("test", 1, 5L);
+        o.add(l);
+
+        assertEquals(o, serializeDeserialize(mapper, o, Set.class));
+
+    }
+
+    @Test
     public void shouldHandleBiFunctionLambda() throws Exception {
         assumeThat(version, either(startsWith("v2")).or(startsWith("v3")));
 

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/3c241bca/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerAuditLogIntegrateTest.java
----------------------------------------------------------------------
diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerAuditLogIntegrateTest.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerAuditLogIntegrateTest.java
index bcce801..7100720 100644
--- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerAuditLogIntegrateTest.java
+++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerAuditLogIntegrateTest.java
@@ -33,6 +33,7 @@ import org.apache.tinkerpop.gremlin.driver.Cluster;
 import org.apache.tinkerpop.gremlin.driver.Channelizer;
 import org.apache.tinkerpop.gremlin.server.channel.HttpChannelizer;
 import org.apache.tinkerpop.gremlin.server.channel.NioChannelizer;
+import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONTokens;
 import org.apache.tinkerpop.shaded.jackson.databind.JsonNode;
 import org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper;
 import org.apache.tinkerpop.gremlin.server.auth.AllowAllAuthenticator;
@@ -302,7 +303,7 @@ public class GremlinServerAuditLogIntegrateTest extends AbstractGremlinServerInt
             assertEquals("application/json", response.getEntity().getContentType().getValue());
             final String json = EntityUtils.toString(response.getEntity());
             final JsonNode node = mapper.readTree(json);
-            assertEquals(0, node.get("result").get("data").get(0).intValue());
+            assertEquals(0, node.get("result").get("data").get(GraphSONTokens.VALUEPROP).get(0).intValue());
         }
 
         final List<LoggingEvent> log = recordingAppender.getEvents();

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/3c241bca/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerHttpIntegrateTest.java
----------------------------------------------------------------------
diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerHttpIntegrateTest.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerHttpIntegrateTest.java
index 643657f..800b82f 100644
--- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerHttpIntegrateTest.java
+++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerHttpIntegrateTest.java
@@ -44,7 +44,6 @@ import java.time.Instant;
 import java.util.Base64;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -268,7 +267,7 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
             assertEquals("application/json", response.getEntity().getContentType().getValue());
             final String json = EntityUtils.toString(response.getEntity());
             final JsonNode node = mapper.readTree(json);
-            assertEquals(0, node.get("result").get("data").get(0).intValue());
+            assertEquals(0, node.get("result").get("data").get(GraphSONTokens.VALUEPROP).get(0).get(GraphSONTokens.VALUEPROP).intValue());
         }
     }
 
@@ -285,7 +284,7 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
             assertEquals("application/json", response.getEntity().getContentType().getValue());
             final String json = EntityUtils.toString(response.getEntity());
             final JsonNode node = mapper.readTree(json);
-            assertEquals(0, node.get("result").get("data").get(0).intValue());
+            assertEquals(0, node.get("result").get("data").get(GraphSONTokens.VALUEPROP).get(0).get(GraphSONTokens.VALUEPROP).intValue());
         }
     }
 
@@ -302,7 +301,7 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
             assertEquals("application/json", response.getEntity().getContentType().getValue());
             final String json = EntityUtils.toString(response.getEntity());
             final JsonNode node = mapper.readTree(json);
-            assertEquals(0, node.get("result").get("data").get(0).intValue());
+            assertEquals(0, node.get("result").get("data").get(GraphSONTokens.VALUEPROP).get(0).get(GraphSONTokens.VALUEPROP).intValue());
         }
     }
 
@@ -320,7 +319,7 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
             assertEquals("application/json", response.getEntity().getContentType().getValue());
             final String json = EntityUtils.toString(response.getEntity());
             final JsonNode node = mapper.readTree(json);
-            assertEquals(0, node.get("result").get("data").get(0).intValue());
+            assertEquals(0, node.get("result").get("data").get(GraphSONTokens.VALUEPROP).get(0).get(GraphSONTokens.VALUEPROP).intValue());
         }
     }
 
@@ -334,7 +333,7 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
             assertEquals("application/json", response.getEntity().getContentType().getValue());
             final String json = EntityUtils.toString(response.getEntity());
             final JsonNode node = mapper.readTree(json);
-            assertEquals(20, node.get("result").get("data").get(0).get("@value").intValue());
+            assertEquals(20, node.get("result").get("data").get(GraphSONTokens.VALUEPROP).get(0).get(GraphSONTokens.VALUEPROP).intValue());
         }
     }
 
@@ -348,7 +347,7 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
             assertEquals("application/json", response.getEntity().getContentType().getValue());
             final String json = EntityUtils.toString(response.getEntity());
             final JsonNode node = mapper.readTree(json);
-            assertEquals(6, node.get("result").get("data").size());
+            assertEquals(6, node.get("result").get("data").get(GraphSONTokens.VALUEPROP).size());
         }
     }
 
@@ -363,7 +362,7 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
             assertEquals("application/json", response.getEntity().getContentType().getValue());
             final String json = EntityUtils.toString(response.getEntity());
             final JsonNode node = mapper.readTree(json);
-            assertEquals(6, node.get("result").get("data").size());
+            assertEquals(6, node.get("result").get("data").get(GraphSONTokens.VALUEPROP).size());
         }
 
         final CloseableHttpClient httpclient = HttpClients.createDefault();
@@ -374,7 +373,7 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
             assertEquals("application/json", response.getEntity().getContentType().getValue());
             final String json = EntityUtils.toString(response.getEntity());
             final JsonNode node = mapper.readTree(json);
-            assertEquals(6, node.get("result").get("data").size());
+            assertEquals(6, node.get("result").get("data").get(GraphSONTokens.VALUEPROP).size());
         }
     }
 
@@ -402,7 +401,7 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
             assertEquals("application/json", response.getEntity().getContentType().getValue());
             final String json = EntityUtils.toString(response.getEntity());
             final JsonNode node = mapper.readTree(json);
-            assertEquals("stephen", node.get("result").get("data").get(0).get(GraphSONTokens.VALUEPROP).get("properties").get("name").get(0).get(GraphSONTokens.VALUEPROP).get(GraphSONTokens.VALUE).asText());
+            assertEquals("stephen", node.get("result").get("data").get(GraphSONTokens.VALUEPROP).get(0).get(GraphSONTokens.VALUEPROP).get("properties").get("name").get(0).get(GraphSONTokens.VALUEPROP).get(GraphSONTokens.VALUE).asText());
         }
     }
 
@@ -416,7 +415,7 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
             assertEquals("application/json", response.getEntity().getContentType().getValue());
             final String json = EntityUtils.toString(response.getEntity());
             final JsonNode node = mapper.readTree(json);
-            assertEquals(20, node.get("result").get("data").get(0).get("@value").intValue());
+            assertEquals(20, node.get("result").get("data").get(GraphSONTokens.VALUEPROP).get(0).get(GraphSONTokens.VALUEPROP).intValue());
         }
     }
 
@@ -441,7 +440,7 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
             assertEquals("application/json", response.getEntity().getContentType().getValue());
             final String json = EntityUtils.toString(response.getEntity());
             final JsonNode node = mapper.readTree(json);
-            assertEquals(0, node.get("result").get("data").get(0).asInt());
+            assertEquals(0, node.get("result").get("data").get(GraphSONTokens.VALUEPROP).get(0).get(GraphSONTokens.VALUEPROP).asInt());
         }
     }
 
@@ -468,7 +467,7 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
             assertEquals("application/json", response.getEntity().getContentType().getValue());
             final String json = EntityUtils.toString(response.getEntity());
             final JsonNode node = mapper.readTree(json);
-            assertEquals(0, node.get("result").get("data").get(0).intValue());
+            assertEquals(0, node.get("result").get("data").get(GraphSONTokens.VALUEPROP).get(0).get(GraphSONTokens.VALUEPROP).intValue());
         }
     }
 
@@ -486,7 +485,7 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
             assertEquals("application/json", response.getEntity().getContentType().getValue());
             final String json = EntityUtils.toString(response.getEntity());
             final JsonNode node = mapper.readTree(json);
-            assertEquals(Instant.MAX, Instant.parse(node.get("result").get("data").get(0).get("@value").asText()));
+            assertEquals(Instant.MAX, Instant.parse(node.get("result").get("data").get(GraphSONTokens.VALUEPROP).get(0).get(GraphSONTokens.VALUEPROP).asText()));
         }
     }
 
@@ -504,7 +503,7 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
             assertEquals("application/json", response.getEntity().getContentType().getValue());
             final String json = EntityUtils.toString(response.getEntity());
             final JsonNode node = mapper.readTree(json);
-            assertEquals(1, node.get("result").get("data").get(0).get("@value").intValue());
+            assertEquals(1, node.get("result").get("data").get(GraphSONTokens.VALUEPROP).get(0).get(GraphSONTokens.VALUEPROP).intValue());
         }
 
         final HttpGet httpget = new HttpGet(TestClientFactory.createURLString("?gremlin=g.V().count()"));
@@ -518,7 +517,7 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
                 assertEquals("application/json", response.getEntity().getContentType().getValue());
                 final String json = EntityUtils.toString(response.getEntity());
                 final JsonNode node = mapper.readTree(json);
-                assertEquals(1, node.get("result").get("data").get(0).get("@value").intValue());
+                assertEquals(1, node.get("result").get("data").get(GraphSONTokens.VALUEPROP).get(0).get(GraphSONTokens.VALUEPROP).intValue());
             }
         }
     }
@@ -538,7 +537,7 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
             assertEquals("application/json", response.getEntity().getContentType().getValue());
             final String json = EntityUtils.toString(response.getEntity());
             final JsonNode node = mapper.readTree(json);
-            assertEquals(1, node.get("result").get("data").size());
+            assertEquals(1, node.get("result").get("data").get(GraphSONTokens.VALUEPROP).size());
         }
 
         final CloseableHttpClient httpclient = HttpClients.createDefault();
@@ -551,7 +550,7 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
             assertEquals("application/json", response.getEntity().getContentType().getValue());
             final String json = EntityUtils.toString(response.getEntity());
             final JsonNode node = mapper.readTree(json);
-            assertEquals(1, node.get("result").get("data").size());
+            assertEquals(1, node.get("result").get("data").get(GraphSONTokens.VALUEPROP).size());
         }
     }
 
@@ -567,7 +566,7 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
             assertEquals("application/json", response.getEntity().getContentType().getValue());
             final String json = EntityUtils.toString(response.getEntity());
             final JsonNode node = mapper.readTree(json);
-            assertEquals(6, node.get("result").get("data").size());
+            assertEquals(6, node.get("result").get("data").get(GraphSONTokens.VALUEPROP).size());
         }
     }
 
@@ -584,10 +583,10 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
             final String json = EntityUtils.toString(response.getEntity());
             final JsonNode resultJson = mapper.readTree(json);
             final JsonNode data = resultJson.get("result").get("data");
-            assertEquals(1, data.size());
+            assertEquals(1, data.get(GraphSONTokens.VALUEPROP).size());
 
-            assertEquals(6, data.get(0).get(GraphSONTokens.VERTICES).get(1).size());
-            assertEquals(6, data.get(0).get(GraphSONTokens.EDGES).get(1).size());
+            assertEquals(6, data.get(GraphSONTokens.VALUEPROP).get(0).get(GraphSONTokens.VERTICES).get(1).size());
+            assertEquals(6, data.get(GraphSONTokens.VALUEPROP).get(0).get(GraphSONTokens.EDGES).get(1).size());
         }
     }
 
@@ -604,7 +603,7 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
             assertEquals("application/json", response.getEntity().getContentType().getValue());
             final String json = EntityUtils.toString(response.getEntity());
             final JsonNode node = mapper.readTree(json);
-            assertEquals(6, node.get("result").get("data").size());
+            assertEquals(6, node.get("result").get("data").get(GraphSONTokens.VALUEPROP).size());
         }
 
         final CloseableHttpClient httpclient = HttpClients.createDefault();
@@ -617,7 +616,7 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
             assertEquals("application/json", response.getEntity().getContentType().getValue());
             final String json = EntityUtils.toString(response.getEntity());
             final JsonNode node = mapper.readTree(json);
-            assertEquals(6, node.get("result").get("data").size());
+            assertEquals(6, node.get("result").get("data").get(GraphSONTokens.VALUEPROP).size());
         }
     }
 
@@ -633,7 +632,7 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
             assertEquals("application/json", response.getEntity().getContentType().getValue());
             final String json = EntityUtils.toString(response.getEntity());
             final JsonNode node = mapper.readTree(json);
-            assertEquals(20, node.get("result").get("data").get(0).get("@value").intValue());
+            assertEquals(20, node.get("result").get("data").get(GraphSONTokens.VALUEPROP).get(0).get(GraphSONTokens.VALUEPROP).intValue());
         }
     }
 
@@ -649,7 +648,7 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
             assertEquals("application/json", response.getEntity().getContentType().getValue());
             final String json = EntityUtils.toString(response.getEntity());
             final JsonNode node = mapper.readTree(json);
-            assertEquals(10, node.get("result").get("data").get(0).get("@value").intValue());
+            assertEquals(10, node.get("result").get("data").get(GraphSONTokens.VALUEPROP).get(0).get(GraphSONTokens.VALUEPROP).intValue());
         }
     }
 
@@ -665,7 +664,7 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
             assertEquals("application/json", response.getEntity().getContentType().getValue());
             final String json = EntityUtils.toString(response.getEntity());
             final JsonNode node = mapper.readTree(json);
-            assertEquals(10.5d, node.get("result").get("data").get(0).get("@value").doubleValue(), 0.0001);
+            assertEquals(10.5d, node.get("result").get("data").get(GraphSONTokens.VALUEPROP).get(0).get(GraphSONTokens.VALUEPROP).doubleValue(), 0.0001);
         }
     }
 
@@ -681,7 +680,7 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
             assertEquals("application/json", response.getEntity().getContentType().getValue());
             final String json = EntityUtils.toString(response.getEntity());
             final JsonNode node = mapper.readTree(json);
-            assertEquals("10", node.get("result").get("data").get(0).textValue());
+            assertEquals("10", node.get("result").get("data").get(GraphSONTokens.VALUEPROP).get(0).textValue());
         }
     }
 
@@ -697,7 +696,7 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
             assertEquals("application/json", response.getEntity().getContentType().getValue());
             final String json = EntityUtils.toString(response.getEntity());
             final JsonNode node = mapper.readTree(json);
-            assertEquals(true, node.get("result").get("data").get(0).booleanValue());
+            assertEquals(true, node.get("result").get("data").get(GraphSONTokens.VALUEPROP).get(0).booleanValue());
         }
     }
 
@@ -713,7 +712,7 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
             assertEquals("application/json", response.getEntity().getContentType().getValue());
             final String json = EntityUtils.toString(response.getEntity());
             final JsonNode node = mapper.readTree(json);
-            assertEquals(true, node.get("result").get("data").get(0).isNull());
+            assertEquals(true, node.get("result").get("data").get(GraphSONTokens.VALUEPROP).get(0).isNull());
         }
     }
 
@@ -729,10 +728,10 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
             assertEquals("application/json", response.getEntity().getContentType().getValue());
             final String json = EntityUtils.toString(response.getEntity());
             final JsonNode node = mapper.readTree(json);
-            assertEquals(true, node.get("result").get("data").isArray());
-            assertEquals(1, node.get("result").get("data").get(0).get("@value").intValue());
-            assertEquals(2, node.get("result").get("data").get(1).get("@value").intValue());
-            assertEquals(3, node.get("result").get("data").get(2).get("@value").intValue());
+            assertEquals(true, node.get("result").get("data").get(GraphSONTokens.VALUEPROP).isArray());
+            assertEquals(1, node.get("result").get("data").get(GraphSONTokens.VALUEPROP).get(0).get(GraphSONTokens.VALUEPROP).intValue());
+            assertEquals(2, node.get("result").get("data").get(GraphSONTokens.VALUEPROP).get(1).get(GraphSONTokens.VALUEPROP).intValue());
+            assertEquals(3, node.get("result").get("data").get(GraphSONTokens.VALUEPROP).get(2).get(GraphSONTokens.VALUEPROP).intValue());
         }
     }
 
@@ -748,8 +747,8 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
             assertEquals("application/json", response.getEntity().getContentType().getValue());
             final String json = EntityUtils.toString(response.getEntity());
             final JsonNode node = mapper.readTree(json);
-            assertEquals(true, node.get("result").get("data").get(0).isObject());
-            assertEquals(1, node.get("result").get("data").get(0).get("@value").get(1).get("@value").asInt());
+            assertEquals("g:Entry", node.get("result").get("data").get(GraphSONTokens.VALUEPROP).get(0).get("@type").asText());
+            assertEquals(1, node.get("result").get("data").get(GraphSONTokens.VALUEPROP).get(0).get(GraphSONTokens.VALUEPROP).get(1).get(GraphSONTokens.VALUEPROP).asInt());
         }
     }
 
@@ -803,7 +802,7 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
             assertEquals("application/json", response.getEntity().getContentType().getValue());
             final String json = EntityUtils.toString(response.getEntity());
             final JsonNode node = mapper.readTree(json);
-            assertEquals(0, node.get("result").get("data").get(0).asInt());
+            assertEquals(0, node.get("result").get("data").get(GraphSONTokens.VALUEPROP).get(0).get(GraphSONTokens.VALUEPROP).asInt());
         }
     }
 
@@ -820,7 +819,7 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
             assertEquals("application/json", response.getEntity().getContentType().getValue());
             final String json = EntityUtils.toString(response.getEntity());
             final JsonNode node = mapper.readTree(json);
-            assertEquals(0, node.get("result").get("data").get(0).asInt());
+            assertEquals(0, node.get("result").get("data").get(GraphSONTokens.VALUEPROP).get(0).get(GraphSONTokens.VALUEPROP).asInt());
         }
     }
 
@@ -882,7 +881,7 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
             assertEquals("application/json", response.getEntity().getContentType().getValue());
             final String json = EntityUtils.toString(response.getEntity());
             final JsonNode node = mapper.readTree(json);
-            assertEquals(0, node.get("result").get("data").get(0).asInt());
+            assertEquals(0, node.get("result").get("data").get(GraphSONTokens.VALUEPROP).get(0).get(GraphSONTokens.VALUEPROP).asInt());
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/3c241bca/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_3_0/metrics-v3d0.json
----------------------------------------------------------------------
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_3_0/metrics-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_3_0/metrics-v3d0.json
index b4f86cd..f6e678b 100644
--- a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_3_0/metrics-v3d0.json
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_3_0/metrics-v3d0.json
@@ -20,30 +20,33 @@
         "@type" : "g:Double",
         "@value" : 25.0
       } ]
-    }, "id", "7.0.0()", "metrics", [ {
-      "@type" : "g:Metrics",
-      "@value" : {
-        "@type" : "g:Map",
-        "@value" : [ "dur", {
-          "@type" : "g:Double",
-          "@value" : 100.0
-        }, "counts", {
+    }, "id", "7.0.0()", "metrics", {
+      "@type" : "g:List",
+      "@value" : [ {
+        "@type" : "g:Metrics",
+        "@value" : {
           "@type" : "g:Map",
-          "@value" : [ "traverserCount", {
-            "@type" : "g:Int64",
-            "@value" : 7
-          }, "elementCount", {
-            "@type" : "g:Int64",
-            "@value" : 7
-          } ]
-        }, "name", "VertexStep(OUT,vertex)", "annotations", {
-          "@type" : "g:Map",
-          "@value" : [ "percentDur", {
+          "@value" : [ "dur", {
             "@type" : "g:Double",
-            "@value" : 25.0
-          } ]
-        }, "id", "3.0.0()" ]
-      }
-    } ] ]
+            "@value" : 100.0
+          }, "counts", {
+            "@type" : "g:Map",
+            "@value" : [ "traverserCount", {
+              "@type" : "g:Int64",
+              "@value" : 7
+            }, "elementCount", {
+              "@type" : "g:Int64",
+              "@value" : 7
+            } ]
+          }, "name", "VertexStep(OUT,vertex)", "annotations", {
+            "@type" : "g:Map",
+            "@value" : [ "percentDur", {
+              "@type" : "g:Double",
+              "@value" : 25.0
+            } ]
+          }, "id", "3.0.0()" ]
+        }
+      } ]
+    } ]
   }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/3c241bca/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_3_0/path-v3d0.json
----------------------------------------------------------------------
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_3_0/path-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_3_0/path-v3d0.json
index 9ccaa00..216b393 100644
--- a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_3_0/path-v3d0.json
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_3_0/path-v3d0.json
@@ -1,34 +1,49 @@
 {
   "@type" : "g:Path",
   "@value" : {
-    "labels" : [ [ ], [ ], [ ] ],
-    "objects" : [ {
-      "@type" : "g:Vertex",
-      "@value" : {
-        "id" : {
-          "@type" : "g:Int32",
-          "@value" : 1
-        },
-        "label" : "person"
-      }
-    }, {
-      "@type" : "g:Vertex",
-      "@value" : {
-        "id" : {
-          "@type" : "g:Int32",
-          "@value" : 10
-        },
-        "label" : "software"
-      }
-    }, {
-      "@type" : "g:Vertex",
-      "@value" : {
-        "id" : {
-          "@type" : "g:Int32",
-          "@value" : 11
-        },
-        "label" : "software"
-      }
-    } ]
+    "labels" : {
+      "@type" : "g:List",
+      "@value" : [ {
+        "@type" : "g:Set",
+        "@value" : [ ]
+      }, {
+        "@type" : "g:Set",
+        "@value" : [ ]
+      }, {
+        "@type" : "g:Set",
+        "@value" : [ ]
+      } ]
+    },
+    "objects" : {
+      "@type" : "g:List",
+      "@value" : [ {
+        "@type" : "g:Vertex",
+        "@value" : {
+          "id" : {
+            "@type" : "g:Int32",
+            "@value" : 1
+          },
+          "label" : "person"
+        }
+      }, {
+        "@type" : "g:Vertex",
+        "@value" : {
+          "id" : {
+            "@type" : "g:Int32",
+            "@value" : 10
+          },
+          "label" : "software"
+        }
+      }, {
+        "@type" : "g:Vertex",
+        "@value" : {
+          "id" : {
+            "@type" : "g:Int32",
+            "@value" : 11
+          },
+          "label" : "software"
+        }
+      } ]
+    }
   }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/3c241bca/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_3_0/standardresult-v3d0.json
----------------------------------------------------------------------
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_3_0/standardresult-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_3_0/standardresult-v3d0.json
index 0be6d51..dfca400 100644
--- a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_3_0/standardresult-v3d0.json
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_3_0/standardresult-v3d0.json
@@ -9,106 +9,109 @@
     }
   },
   "result" : {
-    "data" : [ {
-      "@type" : "g:Vertex",
-      "@value" : {
-        "id" : {
-          "@type" : "g:Int32",
-          "@value" : 1
-        },
-        "label" : "person",
-        "properties" : {
-          "name" : [ {
-            "@type" : "g:VertexProperty",
-            "@value" : {
-              "id" : {
-                "@type" : "g:Int64",
-                "@value" : 0
-              },
-              "value" : "marko",
-              "label" : "name"
-            }
-          } ],
-          "location" : [ {
-            "@type" : "g:VertexProperty",
-            "@value" : {
-              "id" : {
-                "@type" : "g:Int64",
-                "@value" : 6
-              },
-              "value" : "san diego",
-              "label" : "location",
-              "properties" : {
-                "startTime" : {
-                  "@type" : "g:Int32",
-                  "@value" : 1997
+    "data" : {
+      "@type" : "g:List",
+      "@value" : [ {
+        "@type" : "g:Vertex",
+        "@value" : {
+          "id" : {
+            "@type" : "g:Int32",
+            "@value" : 1
+          },
+          "label" : "person",
+          "properties" : {
+            "name" : [ {
+              "@type" : "g:VertexProperty",
+              "@value" : {
+                "id" : {
+                  "@type" : "g:Int64",
+                  "@value" : 0
                 },
-                "endTime" : {
-                  "@type" : "g:Int32",
-                  "@value" : 2001
+                "value" : "marko",
+                "label" : "name"
+              }
+            } ],
+            "location" : [ {
+              "@type" : "g:VertexProperty",
+              "@value" : {
+                "id" : {
+                  "@type" : "g:Int64",
+                  "@value" : 6
+                },
+                "value" : "san diego",
+                "label" : "location",
+                "properties" : {
+                  "startTime" : {
+                    "@type" : "g:Int32",
+                    "@value" : 1997
+                  },
+                  "endTime" : {
+                    "@type" : "g:Int32",
+                    "@value" : 2001
+                  }
                 }
               }
-            }
-          }, {
-            "@type" : "g:VertexProperty",
-            "@value" : {
-              "id" : {
-                "@type" : "g:Int64",
-                "@value" : 7
-              },
-              "value" : "santa cruz",
-              "label" : "location",
-              "properties" : {
-                "startTime" : {
-                  "@type" : "g:Int32",
-                  "@value" : 2001
+            }, {
+              "@type" : "g:VertexProperty",
+              "@value" : {
+                "id" : {
+                  "@type" : "g:Int64",
+                  "@value" : 7
                 },
-                "endTime" : {
-                  "@type" : "g:Int32",
-                  "@value" : 2004
+                "value" : "santa cruz",
+                "label" : "location",
+                "properties" : {
+                  "startTime" : {
+                    "@type" : "g:Int32",
+                    "@value" : 2001
+                  },
+                  "endTime" : {
+                    "@type" : "g:Int32",
+                    "@value" : 2004
+                  }
                 }
               }
-            }
-          }, {
-            "@type" : "g:VertexProperty",
-            "@value" : {
-              "id" : {
-                "@type" : "g:Int64",
-                "@value" : 8
-              },
-              "value" : "brussels",
-              "label" : "location",
-              "properties" : {
-                "startTime" : {
-                  "@type" : "g:Int32",
-                  "@value" : 2004
+            }, {
+              "@type" : "g:VertexProperty",
+              "@value" : {
+                "id" : {
+                  "@type" : "g:Int64",
+                  "@value" : 8
                 },
-                "endTime" : {
-                  "@type" : "g:Int32",
-                  "@value" : 2005
+                "value" : "brussels",
+                "label" : "location",
+                "properties" : {
+                  "startTime" : {
+                    "@type" : "g:Int32",
+                    "@value" : 2004
+                  },
+                  "endTime" : {
+                    "@type" : "g:Int32",
+                    "@value" : 2005
+                  }
                 }
               }
-            }
-          }, {
-            "@type" : "g:VertexProperty",
-            "@value" : {
-              "id" : {
-                "@type" : "g:Int64",
-                "@value" : 9
-              },
-              "value" : "santa fe",
-              "label" : "location",
-              "properties" : {
-                "startTime" : {
-                  "@type" : "g:Int32",
-                  "@value" : 2005
+            }, {
+              "@type" : "g:VertexProperty",
+              "@value" : {
+                "id" : {
+                  "@type" : "g:Int64",
+                  "@value" : 9
+                },
+                "value" : "santa fe",
+                "label" : "location",
+                "properties" : {
+                  "startTime" : {
+                    "@type" : "g:Int32",
+                    "@value" : 2005
+                  }
                 }
               }
-            }
-          } ]
+            } ]
+          }
         }
-      }
-    } ],
+      } ]
+    },
     "meta" : {
       "@type" : "g:Map",
       "@value" : [ ]

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/3c241bca/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_3_0/traversalmetrics-v3d0.json
----------------------------------------------------------------------
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_3_0/traversalmetrics-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_3_0/traversalmetrics-v3d0.json
index 8e7effd..46f7636 100644
--- a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_3_0/traversalmetrics-v3d0.json
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_3_0/traversalmetrics-v3d0.json
@@ -5,102 +5,105 @@
     "@value" : [ "dur", {
       "@type" : "g:Double",
       "@value" : 0.004
-    }, "metrics", [ {
-      "@type" : "g:Metrics",
-      "@value" : {
-        "@type" : "g:Map",
-        "@value" : [ "dur", {
-          "@type" : "g:Double",
-          "@value" : 100.0
-        }, "counts", {
+    }, "metrics", {
+      "@type" : "g:List",
+      "@value" : [ {
+        "@type" : "g:Metrics",
+        "@value" : {
           "@type" : "g:Map",
-          "@value" : [ "traverserCount", {
-            "@type" : "g:Int64",
-            "@value" : 4
-          }, "elementCount", {
-            "@type" : "g:Int64",
-            "@value" : 4
-          } ]
-        }, "name", "TinkerGraphStep(vertex,[~label.eq(person)])", "annotations", {
-          "@type" : "g:Map",
-          "@value" : [ "percentDur", {
+          "@value" : [ "dur", {
             "@type" : "g:Double",
-            "@value" : 25.0
-          } ]
-        }, "id", "7.0.0()" ]
-      }
-    }, {
-      "@type" : "g:Metrics",
-      "@value" : {
-        "@type" : "g:Map",
-        "@value" : [ "dur", {
-          "@type" : "g:Double",
-          "@value" : 100.0
-        }, "counts", {
-          "@type" : "g:Map",
-          "@value" : [ "traverserCount", {
-            "@type" : "g:Int64",
-            "@value" : 13
-          }, "elementCount", {
-            "@type" : "g:Int64",
-            "@value" : 13
-          } ]
-        }, "name", "VertexStep(OUT,vertex)", "annotations", {
+            "@value" : 100.0
+          }, "counts", {
+            "@type" : "g:Map",
+            "@value" : [ "traverserCount", {
+              "@type" : "g:Int64",
+              "@value" : 4
+            }, "elementCount", {
+              "@type" : "g:Int64",
+              "@value" : 4
+            } ]
+          }, "name", "TinkerGraphStep(vertex,[~label.eq(person)])", "annotations", {
+            "@type" : "g:Map",
+            "@value" : [ "percentDur", {
+              "@type" : "g:Double",
+              "@value" : 25.0
+            } ]
+          }, "id", "7.0.0()" ]
+        }
+      }, {
+        "@type" : "g:Metrics",
+        "@value" : {
           "@type" : "g:Map",
-          "@value" : [ "percentDur", {
+          "@value" : [ "dur", {
             "@type" : "g:Double",
-            "@value" : 25.0
-          } ]
-        }, "id", "2.0.0()" ]
-      }
-    }, {
-      "@type" : "g:Metrics",
-      "@value" : {
-        "@type" : "g:Map",
-        "@value" : [ "dur", {
-          "@type" : "g:Double",
-          "@value" : 100.0
-        }, "counts", {
+            "@value" : 100.0
+          }, "counts", {
+            "@type" : "g:Map",
+            "@value" : [ "traverserCount", {
+              "@type" : "g:Int64",
+              "@value" : 13
+            }, "elementCount", {
+              "@type" : "g:Int64",
+              "@value" : 13
+            } ]
+          }, "name", "VertexStep(OUT,vertex)", "annotations", {
+            "@type" : "g:Map",
+            "@value" : [ "percentDur", {
+              "@type" : "g:Double",
+              "@value" : 25.0
+            } ]
+          }, "id", "2.0.0()" ]
+        }
+      }, {
+        "@type" : "g:Metrics",
+        "@value" : {
           "@type" : "g:Map",
-          "@value" : [ "traverserCount", {
-            "@type" : "g:Int64",
-            "@value" : 7
-          }, "elementCount", {
-            "@type" : "g:Int64",
-            "@value" : 7
-          } ]
-        }, "name", "VertexStep(OUT,vertex)", "annotations", {
-          "@type" : "g:Map",
-          "@value" : [ "percentDur", {
+          "@value" : [ "dur", {
             "@type" : "g:Double",
-            "@value" : 25.0
-          } ]
-        }, "id", "3.0.0()" ]
-      }
-    }, {
-      "@type" : "g:Metrics",
-      "@value" : {
-        "@type" : "g:Map",
-        "@value" : [ "dur", {
-          "@type" : "g:Double",
-          "@value" : 100.0
-        }, "counts", {
-          "@type" : "g:Map",
-          "@value" : [ "traverserCount", {
-            "@type" : "g:Int64",
-            "@value" : 1
-          }, "elementCount", {
-            "@type" : "g:Int64",
-            "@value" : 1
-          } ]
-        }, "name", "TreeStep", "annotations", {
+            "@value" : 100.0
+          }, "counts", {
+            "@type" : "g:Map",
+            "@value" : [ "traverserCount", {
+              "@type" : "g:Int64",
+              "@value" : 7
+            }, "elementCount", {
+              "@type" : "g:Int64",
+              "@value" : 7
+            } ]
+          }, "name", "VertexStep(OUT,vertex)", "annotations", {
+            "@type" : "g:Map",
+            "@value" : [ "percentDur", {
+              "@type" : "g:Double",
+              "@value" : 25.0
+            } ]
+          }, "id", "3.0.0()" ]
+        }
+      }, {
+        "@type" : "g:Metrics",
+        "@value" : {
           "@type" : "g:Map",
-          "@value" : [ "percentDur", {
+          "@value" : [ "dur", {
             "@type" : "g:Double",
-            "@value" : 25.0
-          } ]
-        }, "id", "4.0.0()" ]
-      }
-    } ] ]
+            "@value" : 100.0
+          }, "counts", {
+            "@type" : "g:Map",
+            "@value" : [ "traverserCount", {
+              "@type" : "g:Int64",
+              "@value" : 1
+            }, "elementCount", {
+              "@type" : "g:Int64",
+              "@value" : 1
+            } ]
+          }, "name", "TreeStep", "annotations", {
+            "@type" : "g:Map",
+            "@value" : [ "percentDur", {
+              "@type" : "g:Double",
+              "@value" : 25.0
+            } ]
+          }, "id", "4.0.0()" ]
+        }
+      } ]
+    } ]
   }
 }
\ No newline at end of file