diff options
author | Olli Virtanen <ovirtanen@gmail.com> | 2018-06-28 14:19:33 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-06-28 14:19:33 +0200 |
commit | d9be160582d3488c944907f6958e09b9ab1555b8 (patch) | |
tree | 75a2f3a15b6a078d28ec0cb817fa14453620e6fe | |
parent | e0ec82acb6027a58f30cf8a56f944b217580957c (diff) | |
parent | 76282ba6b1964d4eb5f01afdbb47cef34a943e23 (diff) |
Merge pull request #6295 from vespa-engine/ovirtanen/tojson-in-document
Include .toJson() in Document analogously to .toXml()
3 files changed, 67 insertions, 7 deletions
diff --git a/docproc/src/main/java/com/yahoo/docproc/proxy/ProxyDocument.java b/docproc/src/main/java/com/yahoo/docproc/proxy/ProxyDocument.java index 2c2c8e853a3..23555efec50 100644 --- a/docproc/src/main/java/com/yahoo/docproc/proxy/ProxyDocument.java +++ b/docproc/src/main/java/com/yahoo/docproc/proxy/ProxyDocument.java @@ -1,4 +1,4 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.docproc.proxy; import com.yahoo.docproc.Accesses; @@ -278,6 +278,11 @@ public class ProxyDocument extends Document implements DocumentOperationWrapper } @Override + public String toJson() { + return doc.toJson(); + } + + @Override public void onSerialize(Serializer target) throws SerializationException { doc.onSerialize(target); } diff --git a/document/src/main/java/com/yahoo/document/Document.java b/document/src/main/java/com/yahoo/document/Document.java index 025166b5ef9..23beab7523e 100644 --- a/document/src/main/java/com/yahoo/document/Document.java +++ b/document/src/main/java/com/yahoo/document/Document.java @@ -1,17 +1,28 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.document; import com.yahoo.document.datatypes.FieldValue; import com.yahoo.document.datatypes.Struct; import com.yahoo.document.datatypes.StructuredFieldValue; -import com.yahoo.document.serialization.*; +import com.yahoo.document.json.JsonWriter; +import com.yahoo.document.serialization.DocumentReader; +import com.yahoo.document.serialization.DocumentSerializer; +import com.yahoo.document.serialization.DocumentSerializerFactory; +import com.yahoo.document.serialization.DocumentWriter; +import com.yahoo.document.serialization.FieldReader; +import com.yahoo.document.serialization.FieldWriter; +import com.yahoo.document.serialization.SerializationException; +import com.yahoo.document.serialization.XmlSerializationHelper; +import com.yahoo.document.serialization.XmlStream; import com.yahoo.io.GrowableByteBuffer; import com.yahoo.vespa.objects.BufferSerializer; import com.yahoo.vespa.objects.Ids; import com.yahoo.vespa.objects.Serializer; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; +import java.io.UnsupportedEncodingException; import java.util.Iterator; import java.util.Map; @@ -266,6 +277,21 @@ public class Document extends StructuredFieldValue { XmlSerializationHelper.printDocumentXml(this, xml); } + /** + * Get JSON representation of the document root and its children contained in a JSON object + * @return JSON representation of document + */ + public String toJson() { + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + JsonWriter writer = new JsonWriter(buffer); + writer.write(this); + try { + return buffer.toString("UTF-8"); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + } + /** Returns true if the argument is a document which has the same set of values */ @Override public boolean equals(Object o) { @@ -314,8 +340,8 @@ public class Document extends StructuredFieldValue { @SuppressWarnings("deprecation") public void serializeHeader(Serializer data) throws SerializationException { if (data instanceof DocumentWriter) { - if (data instanceof VespaDocumentSerializer42) { - ((VespaDocumentSerializer42)data).setHeaderOnly(true); + if (data instanceof com.yahoo.document.serialization.VespaDocumentSerializer42) { + ((com.yahoo.document.serialization.VespaDocumentSerializer42)data).setHeaderOnly(true); } serialize((DocumentWriter)data); } else if (data instanceof BufferSerializer) { diff --git a/document/src/test/java/com/yahoo/document/DocumentTestCase.java b/document/src/test/java/com/yahoo/document/DocumentTestCase.java index f7cc6974176..84b33b3881c 100644 --- a/document/src/test/java/com/yahoo/document/DocumentTestCase.java +++ b/document/src/test/java/com/yahoo/document/DocumentTestCase.java @@ -1,6 +1,8 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.document; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yahoo.compress.CompressionType; import com.yahoo.document.datatypes.Array; import com.yahoo.document.datatypes.ByteFieldValue; @@ -15,7 +17,12 @@ import com.yahoo.document.datatypes.Raw; import com.yahoo.document.datatypes.StringFieldValue; import com.yahoo.document.datatypes.Struct; import com.yahoo.document.datatypes.WeightedSet; -import com.yahoo.document.serialization.*; +import com.yahoo.document.serialization.DocumentDeserializer; +import com.yahoo.document.serialization.DocumentDeserializerFactory; +import com.yahoo.document.serialization.DocumentReader; +import com.yahoo.document.serialization.DocumentSerializer; +import com.yahoo.document.serialization.DocumentSerializerFactory; +import com.yahoo.document.serialization.XmlDocumentWriter; import com.yahoo.io.GrowableByteBuffer; import com.yahoo.vespa.objects.BufferSerializer; import org.junit.Test; @@ -27,10 +34,13 @@ import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; import java.util.Map; +import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.hamcrest.Matchers.instanceOf; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -40,7 +50,6 @@ import static org.junit.Assert.fail; * @author <a href="thomasg@yahoo-inc.com>Thomas Gundersen</a> * @author bratseth */ -@SuppressWarnings("deprecation") public class DocumentTestCase extends DocumentTestCaseBase { private static final String SERTEST_DOC_AS_XML_HEAD = @@ -1202,6 +1211,26 @@ public class DocumentTestCase extends DocumentTestCaseBase { } @Test + public void testSerializationToJson() throws Exception { + setUpSertestDocType(); + Document doc = getSertestDocument(); + String json = doc.toJson(); + Map<String, Object> parsed = new ObjectMapper().readValue(json, new TypeReference<Map<String, Object>>() { + }); + assertEquals(parsed.get("id"), "doc:sertest:foobar"); + assertThat(parsed.get("fields"), instanceOf(Map.class)); + Object fieldMap = parsed.get("fields"); + if (fieldMap instanceof Map) { + Map<?, ?> fields = (Map<?, ?>) fieldMap; + assertEquals(fields.get("mailid"), "emailfromalicetobob"); + assertEquals(fields.get("date"), -2013512400); + assertThat(fields.get("docindoc"), instanceOf(Map.class)); + assertThat(fields.keySet(), + containsInAnyOrder("mailid", "date", "attachmentcount", "rawfield", "weightedfield", "docindoc", "mapfield")); + } + } + + @Test public void testEmptyStringsSerialization() { docMan = new DocumentTypeManager(); DocumentType docType = new DocumentType("emptystrings"); |