MapNeat is a JVM library written in Kotlin that provides an easy to use DSL (Domain Specific Language) for transforming JSON to JSON, XML to JSON, POJO to JSON in a declarative way.

Overview

MapNeat is a JVM library written in Kotlin that provides an easy to use DSL (Domain Specific Language) for transforming JSON to JSON, XML to JSON, POJO to JSON in a declarative way.

No intermediary POJOs are needed. Given's Kotlin high-interoperability MapNeat can be used in a Java project without any particular hassle. Check the documentation for examples on how to do that.

Under the hood MapNeat is using:

Blog articles:

Table of contents

Getting Started

For newver version (>=0.9.5):

<dependency>
  <groupId>net.andreinc</groupId>
  <artifactId>mapneat</artifactId>
  <version>0.9.6</version>
</dependency>
implementation 'net.andreinc:mapneat:0.9.6

For older versions (<=0.9.4) are available in jcenter() and can use used with Maven and Gradle.

How it works

The library will transform any JSON, XML or POJO into another JSON, without the need of intermediary POJO classes.

Every operation applied to the source JSON (the input) is declarative in nature, and involves significantly less code than writing everything by hand.

Normally, a transformation has the following structure:

val jsonValue : String = "..."
val transformedJson = json(fromJson(jsonValue)) {
    /* operation1 */
    /* operation2 */
    /* operation3 */
    /* conditional block */
        /* operation4 */
}.getPrettyString() // Transformed output

If the source is XML, fromXML(xmlValue: String)can be used. In this case the xmlValue is automatically converted to JSON using JSON In Java.

If the source is a POJO, fromObject(object) can be used. In this case the object is automatically converted to JSON using jackson.

A typical transformation

A typical transformation looks like this:

JSON1:

{
  "id": 380557,
  "first_name": "Gary",
  "last_name": "Young",
  "photo": "http://srcimg.com/100/150",
  "married": false,
  "visits" : [ 
    {
        "country" : "Romania",
        "date" : "2020-10-10"
    },
    {
        "country" : "Romania",
        "date" : "2019-07-21"
    },
    {
        "country" : "Italy",
        "date" : "2019-12-21"
    },
    {
        "country" : "France",
        "date" : "2019-02-21"
    }
  ]
}

JSON2:

{
  "citizenship" : [ "Romanian", "French" ]
}

We write the MapNeat transformation like:

fun main() {
    // JSON1 and JSON2 are both String variables 
    val transform = json(fromJson(JSON1)) {

        "person.id"         /= 100
        "person.firstName"  *= "$.first_name"
        "person.lastName"   *= "$.last_name"

        // We can using a nested json assignment instead of using the "." notation
        "person.meta" /= json {
            "information1" /= "ABC"
            "information2" /= "ABC2"
        }
        
        // We can assign a value from a lambda expression
        "person.maritalStatus" /= {
            if(sourceCtx().read("$.married")) 
                "married" 
            else 
                "unmarried"
        }

        "person.visited" *= {
            // We select only the country name from the visits array
            expression = "$.visits[*].country"
            processor = { countries ->
                // We don't allow duplications so we create a Set
                (countries as List<String>).toMutableSet()
            }
        }

        // We add a new country using the "[+]" notation
        "person.visited[+]" /= "Ireland"

        // We merge another array into the visited[] array
        "person.visited[++]" /= mutableListOf("Israel", "Japan")

        // We look into a secondary json source - JSON2
        // Assigning the citizenship array to a temporary path (person._tmp.array)
        "person._tmp" /= json(fromJson(JSON2)) {
            "array" *= "$.citizenship"
        }

        // We copy the content of temporary array into the path were we want to keep it
        "person._tmp.array" % "person.citizenships"

        // We remove the temporary path
        - "person._tmp"

        // We rename "citizenships" to "citizenship" because we don't like typos
        "person.citizenships" %= "person.citizenship"
    }

    println(transform)
}

After all the operations are performed step by step, the output looks like this:

{
  "person" : {
    "id" : 100,
    "firstName" : "Gary",
    "lastName" : "Young",
    "meta" : {
      "information1" : "ABC",
      "information2" : "ABC2"
    },
    "maritalStatus" : "unmarried",
    "visited" : [ "Romania", "Italy", "France", "Ireland", "Israel", "Japan" ],
    "citizenship" : [ "Romanian", "French" ]
  }
}

Operations

In the previous example you might wonder what the operators /=, *=, %, %=, - are doing.

Those are actually shortcuts methods for the operations we are performing:

Operator Operation Description
/= assign Assigns a given constant or a value computed in lambda expression to a certain path in the target JSON (the result).
*= shift Shifts a portion from the source JSON based on a JSON Path expression.
% copy Copies a path from the target JSON to another another path.
%= move Moves a path from the target JSON to another path.
- delete Deletes a path from the target JSON.

Additionally, the paths from the target JSON can be "decorated" with "array notation":

Array Notation Description
path[] A new array will be created through the assign and shift operations.
path[+] An append will be performed through the assign and shift operations.
path[++] A merge will be performed through the assign and shift operations.

If you prefer, instead of using the operators you can use their equivalent methods.

For example:

"person.name" /= "Andrei"

Can be written as:

"person.name" assign "Andrei"

Or

"person.name" *= "$.user.full_name"

Can be written as:

"person.name" shift "$.user.full_name"

Personally, I prefer the operator notation (/=, *=, etc.), but some people consider the methods (assign, shift) more readable.

For the rest of the examples the operator notation will be used.

Assign (/=)

The Assign Operation is used to assign a value to a path in the resulting JSON (target).

The value can be a constant object, or a lambda (()-> Any).

Example:

package net.andreinc.mapneat.examples

import net.andreinc.mapneat.dsl.json

const val A_SRC_1 = """
{
    "id": 380557,
    "first_name": "Gary",
    "last_name": "Young"
}    
"""

const val A_SRC_2 = """
{
    "photo": "http://srcimg.com/100/150",
    "married": false
}
"""

fun main() {
    val transformed = json(A_SRC_1) {
        // Assigning a constant
        "user.user_name" /= "neo2020"

        // Assigning value from a lambda expression
        "user.first_name" /= { sourceCtx().read("$.first_name") }

        // Assigning value from another JSON source
        "more_info" /= json(A_SRC_2) {
            "married" /= { sourceCtx().read("$.married") }
        }

        // Assigning an inner JSON with the same source as the parent
        "more_info2" /= json {
            "last_name" /= { sourceCtx().read("$.last_name") }
        }
    }
    println(transformed)
}

Output:

{
  "user" : {
    "user_name" : "neo2020",
    "first_name" : "Gary"
  },
  "more_info" : {
    "married" : false
  },
  "more_info2" : {
    "last_name" : "Young"
  }
}

In the lambda method we pass to the /= operation we have access to:

  • sourceCtx() which represents the ReadContext of the source. We can use this to read JSON Paths just like in the example above;
  • targetCtx() which represents the ReacContext of the target. This is calculated each time we call the method. So, it contains only the changes that were made up until that point. In most cases this shouldn't be called.

In case we are using an inner JSON structure, we also have reference to the parent source and target contexts:

  • parent.sourceCtx()
  • parent.targetCtx()

parent() returns a nullable value, so it needs to be used adding !! (double bang).

... {
    "something" /= "Something Value"
    "person" /= json {
        "innerSomething" /= { parent()!!.targetCtx().read("$.something") }
    }
}

For more information about ReadContexts please check json-path's documentation.

The Assign operation can also be used in conjunction with left-side array notations ([], [+], [++]):

fun main() {
    val transformed = json("{}") {
        println("Simple array creation:")
        "a" /= 1
        "b" /= 1
        println(this)

        println("Adds a new value in the array:")
        "a[+]" /= 2
        "b[+]" /= true
        println(this)

        println("Merge in an existing array:")
        "b[++]" /= arrayOf("a", "b", "c")
        println(this)
    }
}

Output:

Simple array creation:
{
  "a" : 1,
  "b" : 1
}
Adds a new value in the array
{
  "a" : [ 1, 2 ],
  "b" : [ 1, true ]
}
Merge in an existing array:
{
  "a" : [ 1, 2 ],
  "b" : [ 1, true, "a", "b", "c" ]
}

Shift (*=)

The Shift operation is very similar to the Assign operation, but it provides an easier way to query the source JSON using json-path.

Example:

package net.andreinc.mapneat.examples

import net.andreinc.mapneat.dsl.json
import java.time.LocalDate
import java.time.format.DateTimeFormatter

val JSON_VAL = """
{
  "id": 380557,
  "first_name": "Gary",
  "last_name": "Young",
  "photo": "http://srcimg.com/100/150",
  "married": false,
  "visits" : [ 
    {
        "country" : "Romania",
        "date" : "2020-10-10"
    },
    {
        "country" : "Romania",
        "date" : "2019-07-21"
    },
    {
        "country" : "Italy",
        "date" : "2019-12-21"
    },
    {
        "country" : "France",
        "date" : "2019-02-21"
    }
  ]
}
"""

fun main() {
    val transformed = json(JSON_VAL) {
        "user.name.first" *= "$.first_name"
        // We use an additional processor to capitalise the last Name
        "user.name.last" *= {
            expression = "$.last_name"
            processor = { (it as String).toUpperCase() }
        }
        // We add the photo directly into an array
        "user.photos[]" *= "$.photo"
        // We don't allow duplicates
        "user.visits.countries" *= {
            expression = "$.visits[*].country"
            processor = { (it as MutableList<String>).toSet().toMutableList() }
        }
        // We keep only the last visit
        "user.visits.lastVisit" *= {
            expression = "$.visits[*].date"
            processor = {
                (it as MutableList<String>)
                    .stream()
                    .map { LocalDate.parse(it, DateTimeFormatter.ISO_DATE) }
                    .max(LocalDate::compareTo)
                    .get()
                    .toString()
            }
        }
    }

    println(transformed)
}

Output:

{
  "user" : {
    "name" : {
      "first" : "Gary",
      "last" : "YOUNG"
    },
    "photos" : [ "http://srcimg.com/100/150" ],
    "visits" : {
      "countries" : [ "Romania", "Italy", "France" ],
      "lastVisit" : "2020-10-10"
    }
  }
}

As you can see in the above example, each expression can be accompanied with an additional processor method that allows developers to refine the results provided by the JSON path expression.

Similar to the Assign lambdas, sourceCtx(), targetCtx(), parent!!.sourceCtx(), parent!!.targetCtx() are also available to the method context and can be used.

If you want to Shift all the source JSON into the target you can use the following transformation:

"" *= "$

Or call the copySourceToTarget() method directly.

In case a field is optional, and you don't want automatically fail the mapping, you can use the leniency property:

"books" *=  {
                expression = "$.store.broken.path"
                lenient = true
            }

Copy (%)

The Copy Operation moves a certain path from the target JSON to another path in the target JSON.

Example:

package net.andreinc.mapneat.examples

import net.andreinc.mapneat.dsl.json

fun main() {
    val transformed = json("{}") {
        "some.long.path" /= mutableListOf("A, B, C")
        "some.long.path" % "copy"
        println(this)
    }
}

Output:

{
  "some" : {
    "long" : {
      "path" : [ "A, B, C" ]
    }
  },
  "copy" : [ "A, B, C" ]
}

Move (%=)

The Move operation moves a certain path from the target JSON to a new path in the target JSON.

Example:

package net.andreinc.mapneat.examples

import net.andreinc.mapneat.dsl.json

fun main() {
    json("{}") {
        "array" /= intArrayOf(1,2,3)
        "array" %= "a.b.c.d"
        println(this)
    }
}

Output:

{
  "a" : {
    "b" : {
      "c" : {
        "d" : [ 1, 2, 3 ]
      }
    }
  }
}

Delete (-)

The Delete operation deletes a certain path from the target JSON.

Example:

package net.andreinc.mapneat.examples

import net.andreinc.mapneat.dsl.json

fun main() {
    json("{}") {
        "a.b.c" /= mutableListOf(1,2,3,4,true)
        "a.b.d" /= "a"
        // deletes the array from "a.b.c"
        - "a.b.c"
        println(this)
    }
}

Output:

{
  "a" : {
    "b" : {
      "d" : "a"
    }
  }
}

Using MapNeat from Java

Given Kotlin's high level of interoperability with Java, MapNeat can be used in any Java application.

The DSL file should remain kotlin, but it can be called from any Java program, as simple as:

@file : JvmName("Sample")

package kotlinPrograms

import net.andreinc.mapneat.dsl.json

fun personTransform(input: String) : String {
    return json(input) {
        "person.name" /= "Andrei"
        "person.age" /= 13
    }.getPrettyString()
}

The java file:

import static kotlinPrograms.Sample.personTransform;

public class Main {
    public static void main(String[] args) {
        // personTransform(String) is the method from Kotlin
        String person = personTransform("{}");
        System.out.println(person);
    }
}

PS: Configuring the Java application to be Kotlin-enabled it's quite simple, usually IntelliJ is doing this automatically without amy developer intervention.

Logging

The library uses log4j2 for logging purposes.

Each transformation gets logged by default to SYSTEM_OUTand to logs/mapneat.log.

For tracing and debugging purposes transformations have two IDs (id, parentId - if inner JSONs are used).

E.g.:

19:05:06.204 [main] INFO  net.andreinc.mapneat.dsl.MapNeat - Transformation(id=a739ba94-dedd-4d5b-bd09-03b30693a1ae, parentId=null) INPUT = {
  "books" : [
    {
      "title" : "Cool dog",
      "author" : "Mike Smith"
    },
    {
      "title": "Feeble Cat",
      "author": "John Cibble"
    },
    {
      "title": "Morning Horse",
      "author": "Kohn Gotcha"
    }
  ],
  "address" : {
    "country" : "RO",
    "street_number": 123,
    "city": "Bucharest"
  }
}
19:05:06.209 [main] INFO  net.andreinc.mapneat.dsl.MapNeat - Transformation(id=a739ba94-dedd-4d5b-bd09-03b30693a1ae, parentId=a739ba94-dedd-4d5b-bd09-03b30693a1ae) INPUT = INHERITED
19:05:06.244 [main] INFO  net.andreinc.mapneat.operation.Assign - (transformationId=a739ba94-dedd-4d5b-bd09-03b30693a1ae) "fullName" ASSIGN(/=) "John Cibble"
19:05:06.246 [main] INFO  net.andreinc.mapneat.operation.Assign - (transformationId=a739ba94-dedd-4d5b-bd09-03b30693a1ae) "firstName" ASSIGN(/=) "John"
19:05:06.246 [main] INFO  net.andreinc.mapneat.operation.Assign - (transformationId=a739ba94-dedd-4d5b-bd09-03b30693a1ae) "lastName" ASSIGN(/=) "Cibble"
19:05:06.248 [main] INFO  net.andreinc.mapneat.operation.Delete - (transformationId=a739ba94-dedd-4d5b-bd09-03b30693a1ae) DELETE(-) "fullName"

(transformationId=a739ba94-dedd-4d5b-bd09-03b30693a1ae) => represents the id Transformation(id=a739ba94-dedd-4d5b-bd09-03b30693a1ae, parentId=a739ba94-dedd-4d5b-bd09-03b30693a1ae) INPUT = INHERITED => marks the parentId

Contributing and Roadmap

The highlevel roadmap for the library at this moment is:

  1. Make mapneat a command-line tool
  2. Create a mapneat-server to serve transformation sync / async

Anyone if free to contribute. You know how github works:).


For more code examples, please check: https://github.com/nomemory/mapneat-examples

Comments
  • Question on copying entire source JSON

    Question on copying entire source JSON

    hello!

    i am currently evaluating this library for transformation and kindly excuse me for this embarrassingly stupid question: how do you you copy the entire original JSON from src to target? the use case that i have is that i want to copy the entire doc but just add a few fields.

    the example input:

    {
      "hello": "world"
    }
    

    and this transformation:

    fun copySourceDoc(input: String): String {
      return json(input) {
        "." *= "$"
       // ... do other transformation stuff here
      }.getPrettyString()
    }
    

    results in:

    {
      "" : {
        "" : {
          "hello" : "world"
        }
      }
    }
    

    i mean, i would assume that there is some flag/parameter that you can use to copy the source by default so i don't even have to explicitly copy it?

    opened by dalegaspi 4
  • Copy Question

    Copy Question

    Is there a way to copy array of objects while excluding certain fields? For example for an input:

    {
      "liveEvent" : [ {
        "liveEventGuid" : "9885d3d8-4ad7-a4a8-0498-3c10b75c9fae",
        "airings" : {
          "airing" : [ {
            "channelId" : "9235",
            "duration" : 0,
            "liveEpisodeMarkerGuid" : "5bcd2046-d610-7a4e-7a9f-0a0c11726ee6",
            "bias" : "2",
            "satelliteOnlyChannel" : false,
            "source" : "IP",
            "platform" : "IP"
          }, {
            "channelId" : "9252",
            "duration" : 0,
            "liveEpisodeMarkerGuid" : "355aa224-eefc-5383-8297-09777e12ae0b",
            "bias" : "1",
            "satelliteOnlyChannel" : false,
            "source" : "IP",
            "platform" : "IP"
          }]
        },
        "updatedAt" : "2021-09-03T18:43:50.235470700Z",
        "contextualBanners" : [ "2nd Inning" ]
      } ]
    }
    

    I would copy all the liveEvent array like this:

    "liveEvent" *= "$.liveEvent[*]"
    

    which works but i would like to exclude the airings field...i presume i'll be using the below notation but I'm not sure what to put in the processor parameter:

    "liveEvent" *= {
      expression = "$.liveEvent[*]"
      processor = { 
        // what do i put here to exclude airings field?
     }
    

    The examples I'm seeing is using expressions that return list of ints or String, but in this case the list is an object (with no pre-defined POJO).

    opened by dalegaspi 3
  • CVE-2020-3651

    CVE-2020-3651

    I believe MapNeat is affected by CVE-2020-3651 because its Jackson dependency is affected by this vulnerability.

    dependencies {
        implementation "com.fasterxml.jackson.core:jackson-databind:2.12.0-rc1"
    }
    

    Mitigation

    According to the GitHub Issue on this vulnerability, upgrading to 2.12.6.1 will fix the problem.

    dependencies {
        implementation "com.fasterxml.jackson.core:jackson-databind:2.12.6.1"
    }
    
    opened by TylerPentecost 1
  • Upgrade to GitHub-native Dependabot

    Upgrade to GitHub-native Dependabot

    Dependabot Preview will be shut down on August 3rd, 2021. In order to keep getting Dependabot updates, please merge this PR and migrate to GitHub-native Dependabot before then.

    Dependabot has been fully integrated into GitHub, so you no longer have to install and manage a separate app. This pull request migrates your configuration from Dependabot.com to a config file, using the new syntax. When merged, we'll swap out dependabot-preview (me) for a new dependabot app, and you'll be all set!

    With this change, you'll now use the Dependabot page in GitHub, rather than the Dependabot dashboard, to monitor your version updates, and you'll configure Dependabot through the new config file rather than a UI.

    If you've got any questions or feedback for us, please let us know by creating an issue in the dependabot/dependabot-core repository.

    Learn more about migrating to GitHub-native Dependabot

    Please note that regular @dependabot commands do not work on this pull request.

    dependencies 
    opened by dependabot-preview[bot] 1
  • Bump kotlin.version from 1.4.10 to 1.4.21-2

    Bump kotlin.version from 1.4.10 to 1.4.21-2

    Bumps kotlin.version from 1.4.10 to 1.4.21-2. Updates kotlin-stdlib from 1.4.10 to 1.4.21-2

    Release notes

    Sourced from kotlin-stdlib's releases.

    Kotlin 1.4.21-2

    This release contains the fix for the kotlinx.serialization plugin working together with Jetpack Compose plugin.

    Please use the 1.4.21 version for your usual production work and use this version only if you want to experiment on kotlinx.serialization and Jetpack Compose together.

    Kotlin 1.4.21

    CHANGELOG

    IDE. Gradle Integration

    • KT-42561 "Could not get unknown property 'sourceSets' for project" when running JVM module with included MPP module
    • KT-43511 Task 'MainKt.main()' not found in root project

    Libraries

    • KT-43586 Source documentation: ExperimentalPathAPI misspelt
    • KT-43745 replace for strings ignores case of locale characters

    Native. C and ObjC Import

    • KT-43265 Kotlin/Native fails to generate alias for C enum entry
    • KT-43530 Kotlin/Native compilation fails with "Symbol for public kotlin/Array.size.|-8255337774232345969[0] is unbound"

    Native

    • KT-43517 On Kotlin 1.4.20 we got kotlin.NotImplementedError when try compile iOS framework

    Tools. Gradle. JS

    • KT-43668 PackageJson task use file dependencies as is (files and directories), but only files necessary

    Checksums

    File Sha256
    kotlin-compiler-1.4.21.zip 46720991a716e90bfc0cf3f2c81b2bd735c14f4ea6a5064c488e04fd76e6b6c7
    kotlin-native-prebuilt-linux-1.4.21.tar.gz ae54afed3e3f65a2e3170b203679e86c78979c0c53dd0d7d7a38cf4fa8d46ca7
    kotlin-native-prebuilt-macos-1.4.21.tar.gz f3a65ea070cbfca89497a14340f1530d1ec37875efc8be9a972b6a7aefde29c0
    kotlin-native-prebuilt-windows-1.4.21.zip 5359f53b01bdc5bd4fd956630e33a0ba36ea0471a8e86fe5405266d899694223

    Kotlin 1.4.20

    CHANGELOG

    Android

    • KT-42121 Deprecate Kotlin Android Extensions compiler plugin
    • KT-42267 Platform declaration clash error in IDE when using kotlinx.android.parcel.Parcelize
    • KT-42406 Long or infinite code analysis on simple files modification

    ... (truncated)

    Changelog

    Sourced from kotlin-stdlib's changelog.

    CHANGELOG

    1.4.30-M1

    Android

    • KT-42383 HMPP: Bad IDEA dependencies: Missing dependency from p1:jvmAndAndroid to p2:jvmAndAndroid

    Backend. Native

    • KT-38772 Native: support non-reified type parameters in typeOf
    • KT-42234 Move LLVM optimization parameters into konan.properties
    • KT-42649 IndexOutOfBoundsException during InlineClassTransformer lowering
    • KT-42942 Native: optimize peak backend memory by clearing BindingContext after psi2ir
    • KT-43198 init blocks inside inline classes
    • KT-31072 Don't use non-reified arguments to specialize type operations in IR inliner

    Backend. JS

    • KT-41227 KJS IR: don't copy to child's prototype references to the function from parent

    Backend. IR

    • KT-41227 KJS IR: don't copy to child's prototype references to the function from parent

    Compiler

    New Features

    • KT-28055 Consider supporting init blocks inside inline classes
    • KT-28056 Consider supporting non-public primary constructors for inline classes
    • KT-42094 Allow open callable members in expect interfaces
    • KT-43129 FIR: Support OverloadResolutionByLambdaReturnType

    Performance Improvements

    • KT-41352 JVM IR: reduce bytecode size in for loops and range checks with 'until' by not using inclusive end
    • KT-41644 NI: Infinite compilation
    • KT-42791 OutOfMemoryError on compilation using kotlin 1.4 on a class with a lot of type inference
    • KT-42920 NI: Improve performance around adding constraints

    Fixes

    • KT-22465 Excessive synthetic method for private setter from superclass
    • KT-26229 Lambda/anonymous function argument in parentheses is not supported for callsInPlace effect
    • KT-32228 Inconsistent boxing/unboxing for inline classes when interface is specialized by object expression
    • KT-32450 Inline class incorrectly gets re-wrapped when provided to a function
    • KT-35849 Missing nullability assertion on lambda return value if expected type has generic return value type
    • KT-35902 Kotlin generates a private parameterless constructor for constructors taking inline class arguments with default values
    • KT-36769 JVM IR: Missing LVT entries for inline function (default) parameters at call site
    • KT-36982 JVM IR: SAM adapter classes are generated as synthetic

    ... (truncated)

    Commits
    • 403d91c Additional fix for Compose:
    • a3b1456 Revert using regex Pattern in String.replace
    • cb93152 Build: Set file access rights explicitly in kotlin-stdlib-js jar
    • 4c44045 Bumped K/N version
    • 40abf82 [Gradle, JS] Add filter on file on fileCollectionDependencies because Gradle ...
    • 166ce6a KTIJ-585 [Gradle Runner]: main() cannot be launched from AS 4.1
    • 5e23440 IC & Coroutines: Do not box suspend operator fun invoke receiver
    • 0b495c1 IC & Coroutines: Unbox inline class parameter of suspend lambda
    • a48f76d IC & Coroutines: Unbox inline classes of suspend lambdas
    • a173e0e Fix annotation spelling in docs
    • Additional commits viewable in compare view

    Updates kotlin-scripting-jvm-host from 1.4.10 to 1.4.21-2

    Release notes

    Sourced from kotlin-scripting-jvm-host's releases.

    Kotlin 1.4.21-2

    This release contains the fix for the kotlinx.serialization plugin working together with Jetpack Compose plugin.

    Please use the 1.4.21 version for your usual production work and use this version only if you want to experiment on kotlinx.serialization and Jetpack Compose together.

    Kotlin 1.4.21

    CHANGELOG

    IDE. Gradle Integration

    • KT-42561 "Could not get unknown property 'sourceSets' for project" when running JVM module with included MPP module
    • KT-43511 Task 'MainKt.main()' not found in root project

    Libraries

    • KT-43586 Source documentation: ExperimentalPathAPI misspelt
    • KT-43745 replace for strings ignores case of locale characters

    Native. C and ObjC Import

    • KT-43265 Kotlin/Native fails to generate alias for C enum entry
    • KT-43530 Kotlin/Native compilation fails with "Symbol for public kotlin/Array.size.|-8255337774232345969[0] is unbound"

    Native

    • KT-43517 On Kotlin 1.4.20 we got kotlin.NotImplementedError when try compile iOS framework

    Tools. Gradle. JS

    • KT-43668 PackageJson task use file dependencies as is (files and directories), but only files necessary

    Checksums

    File Sha256
    kotlin-compiler-1.4.21.zip 46720991a716e90bfc0cf3f2c81b2bd735c14f4ea6a5064c488e04fd76e6b6c7
    kotlin-native-prebuilt-linux-1.4.21.tar.gz ae54afed3e3f65a2e3170b203679e86c78979c0c53dd0d7d7a38cf4fa8d46ca7
    kotlin-native-prebuilt-macos-1.4.21.tar.gz f3a65ea070cbfca89497a14340f1530d1ec37875efc8be9a972b6a7aefde29c0
    kotlin-native-prebuilt-windows-1.4.21.zip 5359f53b01bdc5bd4fd956630e33a0ba36ea0471a8e86fe5405266d899694223

    Kotlin 1.4.20

    CHANGELOG

    Android

    • KT-42121 Deprecate Kotlin Android Extensions compiler plugin
    • KT-42267 Platform declaration clash error in IDE when using kotlinx.android.parcel.Parcelize
    • KT-42406 Long or infinite code analysis on simple files modification

    ... (truncated)

    Changelog

    Sourced from kotlin-scripting-jvm-host's changelog.

    CHANGELOG

    1.4.30-M1

    Android

    • KT-42383 HMPP: Bad IDEA dependencies: Missing dependency from p1:jvmAndAndroid to p2:jvmAndAndroid

    Backend. Native

    • KT-38772 Native: support non-reified type parameters in typeOf
    • KT-42234 Move LLVM optimization parameters into konan.properties
    • KT-42649 IndexOutOfBoundsException during InlineClassTransformer lowering
    • KT-42942 Native: optimize peak backend memory by clearing BindingContext after psi2ir
    • KT-43198 init blocks inside inline classes
    • KT-31072 Don't use non-reified arguments to specialize type operations in IR inliner

    Backend. JS

    • KT-41227 KJS IR: don't copy to child's prototype references to the function from parent

    Backend. IR

    • KT-41227 KJS IR: don't copy to child's prototype references to the function from parent

    Compiler

    New Features

    • KT-28055 Consider supporting init blocks inside inline classes
    • KT-28056 Consider supporting non-public primary constructors for inline classes
    • KT-42094 Allow open callable members in expect interfaces
    • KT-43129 FIR: Support OverloadResolutionByLambdaReturnType

    Performance Improvements

    • KT-41352 JVM IR: reduce bytecode size in for loops and range checks with 'until' by not using inclusive end
    • KT-41644 NI: Infinite compilation
    • KT-42791 OutOfMemoryError on compilation using kotlin 1.4 on a class with a lot of type inference
    • KT-42920 NI: Improve performance around adding constraints

    Fixes

    • KT-22465 Excessive synthetic method for private setter from superclass
    • KT-26229 Lambda/anonymous function argument in parentheses is not supported for callsInPlace effect
    • KT-32228 Inconsistent boxing/unboxing for inline classes when interface is specialized by object expression
    • KT-32450 Inline class incorrectly gets re-wrapped when provided to a function
    • KT-35849 Missing nullability assertion on lambda return value if expected type has generic return value type
    • KT-35902 Kotlin generates a private parameterless constructor for constructors taking inline class arguments with default values
    • KT-36769 JVM IR: Missing LVT entries for inline function (default) parameters at call site
    • KT-36982 JVM IR: SAM adapter classes are generated as synthetic

    ... (truncated)

    Commits
    • 403d91c Additional fix for Compose:
    • a3b1456 Revert using regex Pattern in String.replace
    • cb93152 Build: Set file access rights explicitly in kotlin-stdlib-js jar
    • 4c44045 Bumped K/N version
    • 40abf82 [Gradle, JS] Add filter on file on fileCollectionDependencies because Gradle ...
    • 166ce6a KTIJ-585 [Gradle Runner]: main() cannot be launched from AS 4.1
    • 5e23440 IC & Coroutines: Do not box suspend operator fun invoke receiver
    • 0b495c1 IC & Coroutines: Unbox inline class parameter of suspend lambda
    • a48f76d IC & Coroutines: Unbox inline classes of suspend lambdas
    • a173e0e Fix annotation spelling in docs
    • Additional commits viewable in compare view

    Updates kotlin-scripting-jvm from 1.4.10 to 1.4.21-2

    Release notes

    Sourced from kotlin-scripting-jvm's releases.

    Kotlin 1.4.21-2

    This release contains the fix for the kotlinx.serialization plugin working together with Jetpack Compose plugin.

    Please use the 1.4.21 version for your usual production work and use this version only if you want to experiment on kotlinx.serialization and Jetpack Compose together.

    Kotlin 1.4.21

    CHANGELOG

    IDE. Gradle Integration

    • KT-42561 "Could not get unknown property 'sourceSets' for project" when running JVM module with included MPP module
    • KT-43511 Task 'MainKt.main()' not found in root project

    Libraries

    • KT-43586 Source documentation: ExperimentalPathAPI misspelt
    • KT-43745 replace for strings ignores case of locale characters

    Native. C and ObjC Import

    • KT-43265 Kotlin/Native fails to generate alias for C enum entry
    • KT-43530 Kotlin/Native compilation fails with "Symbol for public kotlin/Array.size.|-8255337774232345969[0] is unbound"

    Native

    • KT-43517 On Kotlin 1.4.20 we got kotlin.NotImplementedError when try compile iOS framework

    Tools. Gradle. JS

    • KT-43668 PackageJson task use file dependencies as is (files and directories), but only files necessary

    Checksums

    File Sha256
    kotlin-compiler-1.4.21.zip 46720991a716e90bfc0cf3f2c81b2bd735c14f4ea6a5064c488e04fd76e6b6c7
    kotlin-native-prebuilt-linux-1.4.21.tar.gz ae54afed3e3f65a2e3170b203679e86c78979c0c53dd0d7d7a38cf4fa8d46ca7
    kotlin-native-prebuilt-macos-1.4.21.tar.gz f3a65ea070cbfca89497a14340f1530d1ec37875efc8be9a972b6a7aefde29c0
    kotlin-native-prebuilt-windows-1.4.21.zip 5359f53b01bdc5bd4fd956630e33a0ba36ea0471a8e86fe5405266d899694223

    Kotlin 1.4.20

    CHANGELOG

    Android

    • KT-42121 Deprecate Kotlin Android Extensions compiler plugin
    • KT-42267 Platform declaration clash error in IDE when using kotlinx.android.parcel.Parcelize
    • KT-42406 Long or infinite code analysis on simple files modification

    ... (truncated)

    Changelog

    Sourced from kotlin-scripting-jvm's changelog.

    CHANGELOG

    1.4.30-M1

    Android

    • KT-42383 HMPP: Bad IDEA dependencies: Missing dependency from p1:jvmAndAndroid to p2:jvmAndAndroid

    Backend. Native

    • KT-38772 Native: support non-reified type parameters in typeOf
    • KT-42234 Move LLVM optimization parameters into konan.properties
    • KT-42649 IndexOutOfBoundsException during InlineClassTransformer lowering
    • KT-42942 Native: optimize peak backend memory by clearing BindingContext after psi2ir
    • KT-43198 init blocks inside inline classes
    • KT-31072 Don't use non-reified arguments to specialize type operations in IR inliner

    Backend. JS

    • KT-41227 KJS IR: don't copy to child's prototype references to the function from parent

    Backend. IR

    • KT-41227 KJS IR: don't copy to child's prototype references to the function from parent

    Compiler

    New Features

    • KT-28055 Consider supporting init blocks inside inline classes
    • KT-28056 Consider supporting non-public primary constructors for inline classes
    • KT-42094 Allow open callable members in expect interfaces
    • KT-43129 FIR: Support OverloadResolutionByLambdaReturnType

    Performance Improvements

    • KT-41352 JVM IR: reduce bytecode size in for loops and range checks with 'until' by not using inclusive end
    • KT-41644 NI: Infinite compilation
    • KT-42791 OutOfMemoryError on compilation using kotlin 1.4 on a class with a lot of type inference
    • KT-42920 NI: Improve performance around adding constraints

    Fixes

    • KT-22465 Excessive synthetic method for private setter from superclass
    • KT-26229 Lambda/anonymous function argument in parentheses is not supported for callsInPlace effect
    • KT-32228 Inconsistent boxing/unboxing for inline classes when interface is specialized by object expression
    • KT-32450 Inline class incorrectly gets re-wrapped when provided to a function
    • KT-35849 Missing nullability assertion on lambda return value if expected type has generic return value type
    • KT-35902 Kotlin generates a private parameterless constructor for constructors taking inline class arguments with default values
    • KT-36769 JVM IR: Missing LVT entries for inline function (default) parameters at call site
    • KT-36982 JVM IR: SAM adapter classes are generated as synthetic

    ... (truncated)

    Commits
    • 403d91c Additional fix for Compose:
    • a3b1456 Revert using regex Pattern in String.replace
    • cb93152 Build: Set file access rights explicitly in kotlin-stdlib-js jar
    • 4c44045 Bumped K/N version
    • 40abf82 [Gradle, JS] Add filter on file on fileCollectionDependencies because Gradle ...
    • 166ce6a KTIJ-585 [Gradle Runner]: main() cannot be launched from AS 4.1
    • 5e23440 IC & Coroutines: Do not box suspend operator fun invoke receiver
    • 0b495c1 IC & Coroutines: Unbox inline class parameter of suspend lambda
    • a48f76d IC & Coroutines: Unbox inline classes of suspend lambdas
    • a173e0e Fix annotation spelling in docs
    • Additional commits viewable in compare view

    Updates kotlin-reflect from 1.4.10 to 1.4.21-2

    Release notes

    Sourced from kotlin-reflect's releases.

    Kotlin 1.4.21-2

    This release contains the fix for the kotlinx.serialization plugin working together with Jetpack Compose plugin.

    Please use the 1.4.21 version for your usual production work and use this version only if you want to experiment on kotlinx.serialization and Jetpack Compose together.

    Kotlin 1.4.21

    CHANGELOG

    IDE. Gradle Integration

    • KT-42561 "Could not get unknown property 'sourceSets' for project" when running JVM module with included MPP module
    • KT-43511 Task 'MainKt.main()' not found in root project

    Libraries

    • KT-43586 Source documentation: ExperimentalPathAPI misspelt
    • KT-43745 replace for strings ignores case of locale characters

    Native. C and ObjC Import

    • KT-43265 Kotlin/Native fails to generate alias for C enum entry
    • KT-43530 Kotlin/Native compilation fails with "Symbol for public kotlin/Array.size.|-8255337774232345969[0] is unbound"

    Native

    • KT-43517 On Kotlin 1.4.20 we got kotlin.NotImplementedError when try compile iOS framework

    Tools. Gradle. JS

    • KT-43668 PackageJson task use file dependencies as is (files and directories), but only files necessary

    Checksums

    File Sha256
    kotlin-compiler-1.4.21.zip 46720991a716e90bfc0cf3f2c81b2bd735c14f4ea6a5064c488e04fd76e6b6c7
    kotlin-native-prebuilt-linux-1.4.21.tar.gz ae54afed3e3f65a2e3170b203679e86c78979c0c53dd0d7d7a38cf4fa8d46ca7
    kotlin-native-prebuilt-macos-1.4.21.tar.gz f3a65ea070cbfca89497a14340f1530d1ec37875efc8be9a972b6a7aefde29c0
    kotlin-native-prebuilt-windows-1.4.21.zip 5359f53b01bdc5bd4fd956630e33a0ba36ea0471a8e86fe5405266d899694223

    Kotlin 1.4.20

    CHANGELOG

    Android

    • KT-42121 Deprecate Kotlin Android Extensions compiler plugin
    • KT-42267 Platform declaration clash error in IDE when using kotlinx.android.parcel.Parcelize
    • KT-42406 Long or infinite code analysis on simple files modification

    ... (truncated)

    Changelog

    Sourced from kotlin-reflect's changelog.

    CHANGELOG

    1.4.30-M1

    Android

    • KT-42383 HMPP: Bad IDEA dependencies: Missing dependency from p1:jvmAndAndroid to p2:jvmAndAndroid

    Backend. Native

    • KT-38772 Native: support non-reified type parameters in typeOf
    • KT-42234 Move LLVM optimization parameters into konan.properties
    • KT-42649 IndexOutOfBoundsException during InlineClassTransformer lowering
    • KT-42942 Native: optimize peak backend memory by clearing BindingContext after psi2ir
    • KT-43198 init blocks inside inline classes
    • KT-31072 Don't use non-reified arguments to specialize type operations in IR inliner

    Backend. JS

    • KT-41227 KJS IR: don't copy to child's prototype references to the function from parent

    Backend. IR

    • KT-41227 KJS IR: don't copy to child's prototype references to the function from parent

    Compiler

    New Features

    • KT-28055 Consider supporting init blocks inside inline classes
    • KT-28056 Consider supporting non-public primary constructors for inline classes
    • KT-42094 Allow open callable members in expect interfaces
    • KT-43129 FIR: Support OverloadResolutionByLambdaReturnType

    Performance Improvements

    • KT-41352 JVM IR: reduce bytecode size in for loops and range checks with 'until' by not using inclusive end
    • KT-41644 NI: Infinite compilation
    • KT-42791 OutOfMemoryError on compilation using kotlin 1.4 on a class with a lot of type inference
    • KT-42920 NI: Improve performance around adding constraints

    Fixes

    • KT-22465 Excessive synthetic method for private setter from superclass
    • KT-26229 Lambda/anonymous function argument in parentheses is not supported for callsInPlace effect
    • KT-32228 Inconsistent boxing/unboxing for inline classes when interface is specialized by object expression
    • KT-32450 Inline class incorrectly gets re-wrapped when provided to a function
    • KT-35849 Missing nullability assertion on lambda return value if expected type has generic return value type
    • KT-35902 Kotlin generates a private parameterless constructor for constructors taking inline class arguments with default values
    • KT-36769 JVM IR: Missing LVT entries for inline function (default) parameters at call site
    • KT-36982 JVM IR: SAM adapter classes are generated as synthetic

    ... (truncated)

    Commits
    • 403d91c Additional fix for Compose:
    • a3b1456 Revert using regex Pattern in String.replace
    • cb93152 Build: Set file access rights explicitly in kotlin-stdlib-js jar
    • 4c44045 Bumped K/N version
    • 40abf82 [Gradle, JS] Add filter on file on fileCollectionDependencies because Gradle ...
    • 166ce6a KTIJ-585 [Gradle Runner]: main() cannot be launched from AS 4.1
    • 5e23440 IC & Coroutines: Do not box suspend operator fun invoke receiver
    • 0b495c1 IC & Coroutines: Unbox inline class parameter of suspend lambda
    • a48f76d IC & Coroutines: Unbox inline classes of suspend lambdas
    • a173e0e Fix annotation spelling in docs
    • Additional commits viewable in compare view

    Updates kotlin-maven-plugin from 1.4.10 to 1.4.21-2

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Note: This repo was added to Dependabot recently, so you'll receive a maximum of 5 PRs for your first few update runs. Once an update run creates fewer than 5 PRs we'll remove that limit.

    You can always request more updates by clicking Bump now in your Dependabot dashboard.

    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language
    • @dependabot badge me will comment on this PR with code to add a "Dependabot enabled" badge to your readme

    Additionally, you can set the following in your Dependabot dashboard:

    • Update frequency (including time of day and day of week)
    • Pull request limits (per update run and/or open at any time)
    • Automerge options (never/patch/minor, and dev/runtime dependencies)
    • Out-of-range updates (receive only lockfile updates, if desired)
    • Security updates (receive only security updates, if desired)
    dependencies 
    opened by dependabot-preview[bot] 1
  • Bump jackson-databind from 2.12.0-rc1 to 2.12.1

    Bump jackson-databind from 2.12.0-rc1 to 2.12.1

    Bumps jackson-databind from 2.12.0-rc1 to 2.12.1.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Note: This repo was added to Dependabot recently, so you'll receive a maximum of 5 PRs for your first few update runs. Once an update run creates fewer than 5 PRs we'll remove that limit.

    You can always request more updates by clicking Bump now in your Dependabot dashboard.

    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language
    • @dependabot badge me will comment on this PR with code to add a "Dependabot enabled" badge to your readme

    Additionally, you can set the following in your Dependabot dashboard:

    • Update frequency (including time of day and day of week)
    • Pull request limits (per update run and/or open at any time)
    • Automerge options (never/patch/minor, and dev/runtime dependencies)
    • Out-of-range updates (receive only lockfile updates, if desired)
    • Security updates (receive only security updates, if desired)
    dependencies 
    opened by dependabot-preview[bot] 1
  • Why no duplicates?

    Why no duplicates?

    I'm looking for json to json transformers for a translation layer between different schemas, one of which I do not own. Obviously a good use case for your library which looks awesome :)

    In general, duplicates are annoying, and if I'm merging from multiple sources into the same target it's possible it'll create a bug. However, JSON allows for duplicates and if there are duplicates in the source I should certainly honor that.

    I'm struggling to come up with a well formed schema that leads to such, but I can think of real world examples of less than pretty data.

    Sometimes you run into associated arrays

    { "ratings_providers": [ "a", "b", "c" ], "ratings": [ 5, 5, 4.5 ] }

    Not my favorite but I've seen it and I may have to merge into it. I'm not sure what other cases I might have. It may be best if I run into them and then bring them back but if they are in the source that might cause a production bug...

    Thoughts? Could we turn it on or off as optional parameters to the json object constructor?

    opened by smonasco 1
  • Please provide possibility to update JsonPath configuration options

    Please provide possibility to update JsonPath configuration options

    When accessing missing property in supplied json JsonPath throws an exception. There is an option com.jayway.jsonpath.Option.SUPPRESS_EXCEPTIONS that we would like to use in JsonPath configuration, but there is no means to update JsonPath configuration in the library.

    opened by eugene-cheverda 0
  • Dependabot couldn't find a pom.xml for this project

    Dependabot couldn't find a pom.xml for this project

    Dependabot couldn't find a pom.xml for this project.

    Dependabot requires a pom.xml to evaluate your project's current Java dependencies. It had expected to find one at the path: /pom.xml.

    If this isn't a Java project, or if it is a library, you may wish to disable updates for it from within Dependabot.

    View the update logs.

    opened by dependabot-preview[bot] 0
  • Dependabot couldn't find a pom.xml for this project

    Dependabot couldn't find a pom.xml for this project

    Dependabot couldn't find a pom.xml for this project.

    Dependabot requires a pom.xml to evaluate your project's current Java dependencies. It had expected to find one at the path: /pom.xml.

    If this isn't a Java project, or if it is a library, you may wish to disable updates for it from within Dependabot.

    View the update logs.

    opened by dependabot-preview[bot] 0
  • Dependabot couldn't find a pom.xml for this project

    Dependabot couldn't find a pom.xml for this project

    Dependabot couldn't find a pom.xml for this project.

    Dependabot requires a pom.xml to evaluate your project's current Java dependencies. It had expected to find one at the path: /pom.xml.

    If this isn't a Java project, or if it is a library, you may wish to disable updates for it from within Dependabot.

    View the update logs.

    opened by dependabot-preview[bot] 0
  • Update dependency to resolve issue relating to log4j CVE

    Update dependency to resolve issue relating to log4j CVE

    A critical CVE has been discovered in Log4J that requires immediate resolution.

    Further detail can be found here and here.

    A dependency update is required of log4j dependencies to resolve.

    opened by ReidWeb 16
Owner
Andrei Ciobanu
Andrei Ciobanu
JSON Library for Java with a focus on providing a clean DSL

JSON Library for Java with a focus on providing a clean DSL

Vaishnav Anil 0 Jul 11, 2022
Simple, efficient Excel to POJO library for Java

ZeroCell ZeroCell provides a simple API for loading data from Excel sheets into Plain Old Java Objects (POJOs) using annotations to map columns from a

Credit Data CRB 68 Dec 8, 2022
A declarative API to handle Android runtime permissions.

PermissionsDispatcher Fully Kotlin/Java support Special permissions support 100% reflection-free PermissionsDispatcher provides a simple annotation-ba

PermissionsDispatcher 11.1k Jan 5, 2023
A MATLAB-like scientific scripting environment for Kotlin, a simpler Kotlin only version of KotlinLab

KotlinLab: Easy and effective MATLAB-like scientific programming with Kotlin and Java JShell Installation The installation of KotlinLab is very simple

Stergios Papadimitriou 11 Sep 28, 2022
JSON to JSON transformation library written in Java.

Jolt JSON to JSON transformation library written in Java where the "specification" for the transform is itself a JSON document. Useful For Transformin

Bazaarvoice 1.3k Dec 30, 2022
A compiler built in Java that allows to translate xml format to json.

A compiler built in Java that allows to translate xml format to json. Getting Started Welcome to the VS Code Java world. Here is a guideline to help y

Víctor Andrés Rojas 1 Jan 6, 2022
Framework for serialization to Json, XML, Byte and Excel, therefore an oviparous wool milk sow J

NetworkParser Framework for serialization from Java objects to Json, XML and Byte. NetworkParser is a simple framework for serializing complex model s

Fujaba Tool Suite 4 Nov 18, 2020
A modern JSON library for Kotlin and Java.

Moshi Moshi is a modern JSON library for Android and Java. It makes it easy to parse JSON into Java objects: String json = ...; Moshi moshi = new Mos

Square 8.7k Dec 31, 2022
dOOv (Domain Object Oriented Validation) a fluent API for type-safe bean validation and mapping

dOOv (Domain Object Oriented Validation) dOOv is a fluent API for typesafe domain model validation and mapping. It uses annotations, code generation a

dOOv 77 Nov 20, 2022
Convert Java to JSON. Convert JSON to Java. Pretty print JSON. Java JSON serializer.

json-io Perfect Java serialization to and from JSON format (available on Maven Central). To include in your project: <dependency> <groupId>com.cedar

John DeRegnaucourt 303 Dec 30, 2022
A 250 lines single-source-file hackable JSON deserializer for the JVM. Reinventing the JSON wheel.

JSON Wheel Have you ever written scripts in Java 11+ and needed to operate on some JSON string? Have you ever needed to extract just that one deeply-n

Roman Böhm 14 Jan 4, 2023
Vert.x jOOQ DSL

jOOQ.x - Vertx jOOQ DSL jooqx leverages the power of typesafe SQL from jOOQ DSL and running on SQL connection in a reactive and non-blocking of SQL dr

zero88 18 Nov 16, 2022
100% Java, Lambda Enabled, Lightweight Rules Engine with a Simple and Intuitive DSL

RuleBook » A Simple & Intuitive Rules Abstraction for Java 100% Java · Lambda Enabled · Simple, Intuitive DSL · Lightweight Why RuleBook? RuleBook rul

Delivered Technologies Labs 666 Dec 21, 2022
Java friendly DSL for defining TestFX tests

TestFX-DSL aims to bring DSL capabilities on top of TestFX. Inspired by Geb, this DSL enables a fluent interface design on top of the facilities exposed by TestFX.

Andres Almiray 5 Aug 21, 2019
High performance JVM JSON library

DSL-JSON library Fastest JVM (Java/Android/Scala/Kotlin) JSON library with advanced compile-time databinding support. Compatible with DSL Platform. Ja

New Generation Software Ltd 835 Jan 2, 2023
Uber-project for (some) standard Jackson textual format backends: csv, properties, yaml (xml to be added in future)

Overview This is a multi-module umbrella project for Jackson standard text-format dataformat backends. Dataformat backends are used to support format

FasterXML, LLC 351 Dec 22, 2022
JSON query and transformation language

JSLT JSLT is a complete query and transformation language for JSON. The language design is inspired by jq, XPath, and XQuery. JSLT can be used as: a q

Schibsted Media Group 510 Dec 30, 2022
A query language for JSON and a template engine to generate text output.

Josson & Jossons Josson is a query language for JSON. Jossons is a template engine to generate text output. Features and Capabilities of Josson Query

Octomix Software 16 Dec 14, 2022
kotlin decompiler based on quiltflower

Quiltflower Quiltflower is a fork of Fernflower and ForgeFlower adding additional features for use with the Quilt toolchain. Changes include: Javadoc

Joseph Burton 39 Jan 8, 2023