From ee5afcdafead87023e3478bfd745bf11c7299206 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sat, 29 Jul 2023 12:42:14 +0300 Subject: [PATCH] Update meta serialization rules --- CHANGELOG.md | 1 + build.gradle.kts | 2 +- .../kscience/dataforge/io/JsonMetaFormat.kt | 6 +-- .../space/kscience/dataforge/meta/JsonMeta.kt | 37 +++++++++---------- .../space/kscience/dataforge/meta/Value.kt | 2 +- .../dataforge/meta/MetaSerializationTest.kt | 32 +++++++++++++++- 6 files changed, 55 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 36105b78..710f8569 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ ### Changed - Meta to Json serializer now serializes a single item with index as an array. It is important for plotly integration. +- Meta to Json serializes Meta without children a value as literal or array instead of an object with `@value` field. ### Deprecated diff --git a/build.gradle.kts b/build.gradle.kts index 883306ea..dc9880bd 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -9,7 +9,7 @@ plugins { allprojects { group = "space.kscience" - version = "0.6.2-dev-2" + version = "0.6.2-dev-3" } subprojects { diff --git a/dataforge-io/src/commonMain/kotlin/space/kscience/dataforge/io/JsonMetaFormat.kt b/dataforge-io/src/commonMain/kotlin/space/kscience/dataforge/io/JsonMetaFormat.kt index 4bb3c82d..f3d9e02a 100644 --- a/dataforge-io/src/commonMain/kotlin/space/kscience/dataforge/io/JsonMetaFormat.kt +++ b/dataforge-io/src/commonMain/kotlin/space/kscience/dataforge/io/JsonMetaFormat.kt @@ -6,7 +6,7 @@ package space.kscience.dataforge.io import io.ktor.utils.io.core.Input import io.ktor.utils.io.core.Output import kotlinx.serialization.json.Json -import kotlinx.serialization.json.JsonObject +import kotlinx.serialization.json.JsonElement import space.kscience.dataforge.context.Context import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.descriptors.MetaDescriptor @@ -19,8 +19,8 @@ import space.kscience.dataforge.meta.toMeta public class JsonMetaFormat(private val json: Json = DEFAULT_JSON) : MetaFormat { override fun writeMeta(output: Output, meta: Meta, descriptor: MetaDescriptor?) { - val jsonObject = meta.toJson(descriptor) - output.writeUtf8String(json.encodeToString(JsonObject.serializer(), jsonObject)) + val jsonElement = meta.toJson(descriptor) + output.writeUtf8String(json.encodeToString(JsonElement.serializer(), jsonElement)) } override fun readMeta(input: Input, descriptor: MetaDescriptor?): Meta { diff --git a/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/JsonMeta.kt b/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/JsonMeta.kt index 98f0c3e4..7b21fad2 100644 --- a/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/JsonMeta.kt +++ b/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/JsonMeta.kt @@ -64,30 +64,29 @@ private fun Meta.toJsonWithIndex(descriptor: MetaDescriptor?, index: String?): J JsonObject(pairs.toMap()) } -public fun Meta.toJson(descriptor: MetaDescriptor? = null): JsonObject { - val element = toJsonWithIndex(descriptor, null) - return if (element is JsonObject) { - element - } else { - buildJsonObject { - put("@value", element) - } - } +public fun Meta.toJson(descriptor: MetaDescriptor? = null): JsonElement { + return toJsonWithIndex(descriptor, null) +// val element = toJsonWithIndex(descriptor, null) +// return if (element is JsonObject) { +// element +// } else { +// buildJsonObject { +// put("@value", element) +// } +// } } /** * Convert a Json primitive to a [Value] */ -public fun JsonPrimitive.toValue(descriptor: MetaDescriptor?): Value { - return when (this) { - JsonNull -> Null - else -> { - if (isString) { - StringValue(content) - } else { - //consider using LazyParse - content.parseValue() - } +public fun JsonPrimitive.toValue(descriptor: MetaDescriptor?): Value = when (this) { + JsonNull -> Null + else -> { + if (isString) { + content.asValue() + } else { + //consider using LazyParse + content.parseValue() } } } diff --git a/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/Value.kt b/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/Value.kt index e051c10c..73950f53 100644 --- a/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/Value.kt +++ b/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/Value.kt @@ -226,7 +226,7 @@ public fun > E.asValue(): Value = EnumValue(this) /** - * Create Value from String using closest match conversion + * Create Value from String using the closest match conversion */ public fun String.parseValue(): Value { diff --git a/dataforge-meta/src/commonTest/kotlin/space/kscience/dataforge/meta/MetaSerializationTest.kt b/dataforge-meta/src/commonTest/kotlin/space/kscience/dataforge/meta/MetaSerializationTest.kt index de660e10..0f270bc6 100644 --- a/dataforge-meta/src/commonTest/kotlin/space/kscience/dataforge/meta/MetaSerializationTest.kt +++ b/dataforge-meta/src/commonTest/kotlin/space/kscience/dataforge/meta/MetaSerializationTest.kt @@ -1,15 +1,45 @@ package space.kscience.dataforge.meta import kotlinx.serialization.json.Json +import space.kscience.dataforge.names.asName import kotlin.test.Test import kotlin.test.assertEquals class MetaSerializationTest { @Test - fun singleValueDeserialization(){ + fun singleValueDeserialization() { val string = "ddd" val meta = Json.decodeFromString(MetaSerializer, string) assertEquals(string, meta.value?.string) } + + @Test + fun complexMeta() { + val meta = Meta { + "a" put 28.3 + "b" put doubleArrayOf(1.0, 2.0, 3.2) + "child" put Meta { + "a" put "aString" + "sns[0]" put Meta { + "d" put 0 + } + "sns[1]" put Meta { + "d" put 1 + } + setIndexed( + "sns2".asName(), + listOf( + Meta { "d" put "first" }, + Meta("53") + ) + ) + } + } + + val string = Json.encodeToString(MetaSerializer, meta) + println(string) + val reconstructed = Json.decodeFromString(MetaSerializer, string) + assertEquals(meta, reconstructed) + } } \ No newline at end of file