{"id":21131148,"url":"https://github.com/wnameless/json-flattener","last_synced_at":"2025-05-13T23:00:26.329Z","repository":{"id":35799520,"uuid":"40081122","full_name":"wnameless/json-flattener","owner":"wnameless","description":"A Java utility is designed to FLATTEN nested JSON objects and even more to UNFLATTEN them back","archived":false,"fork":false,"pushed_at":"2025-03-29T12:05:09.000Z","size":426,"stargazers_count":527,"open_issues_count":6,"forks_count":143,"subscribers_count":19,"default_branch":"master","last_synced_at":"2025-04-30T12:17:10.952Z","etag":null,"topics":["java-utilities","json","json-flattener"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wnameless.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2015-08-02T14:03:20.000Z","updated_at":"2025-04-21T04:08:00.000Z","dependencies_parsed_at":"2024-10-26T18:22:01.320Z","dependency_job_id":"bb81df15-51bf-4c7a-b8b6-264b3dd581b8","html_url":"https://github.com/wnameless/json-flattener","commit_stats":null,"previous_names":[],"tags_count":46,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wnameless%2Fjson-flattener","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wnameless%2Fjson-flattener/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wnameless%2Fjson-flattener/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wnameless%2Fjson-flattener/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wnameless","download_url":"https://codeload.github.com/wnameless/json-flattener/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254040132,"owners_count":22004452,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["java-utilities","json","json-flattener"],"created_at":"2024-11-20T05:49:51.435Z","updated_at":"2025-05-13T23:00:26.253Z","avatar_url":"https://github.com/wnameless.png","language":"Java","funding_links":[],"categories":["\u003ca name=\"Java\"\u003e\u003c/a\u003eJava"],"sub_categories":[],"readme":"[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.github.wnameless.json/json-flattener/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.github.wnameless.json/json-flattener)\n[![codecov](https://codecov.io/gh/wnameless/json-flattener/branch/master/graph/badge.svg)](https://codecov.io/gh/wnameless/json-flattener)\n\njson-flattener\n=============\nA Java utility is designed to FLATTEN nested JSON objects and even more to UNFLATTEN them back.\n\n## Purpose\nConverts a nested JSON\n```json\n{ \"a\":\n  { \"b\": 1,\n    \"c\": null,\n    \"d\": [false, true]\n  },\n  \"e\": \"f\",\n  \"g\": 2.3\n}\n```\ninto a flattened JSON\n```json\n{ \"a.b\": 1,\n  \"a.c\": null,\n  \"a.d[0]\": false,\n  \"a.d[1]\": true,\n  \"e\": \"f\",\n  \"g\": 2.3\n}\n```\nor a Java Map\n```java\n// {a.b=1, a.c=null, a.d[0]=false, a.d[1]=true, e=f, g=2.3}\n```\n\n# Maven Repo\n```xml\n\u003cdependency\u003e\n\t\u003cgroupId\u003ecom.github.wnameless.json\u003c/groupId\u003e\n\t\u003cartifactId\u003ejson-flattener\u003c/artifactId\u003e\n\t\u003cversion\u003e${newestVersion}\u003c/version\u003e\n\t\u003c!-- Newest version shows in the maven-central badge above --\u003e\n\u003c/dependency\u003e\n```\n\n# Quick Start\n```java\nString json = \"{ \\\"a\\\" : { \\\"b\\\" : 1, \\\"c\\\": null, \\\"d\\\": [false, true] }, \\\"e\\\": \\\"f\\\", \\\"g\\\":2.3 }\";\n\n// { \"a\":\n//   { \"b\": 1,\n//     \"c\": null,\n//     \"d\": [false, true]\n//   },\n//   \"e\": \"f\",\n//   \"g\": 2.3\n// }\n```\n\nFlatten to Java Map\n```java\nMap\u003cString, Object\u003e flattenJson = JsonFlattener.flattenAsMap(json);\n\nSystem.out.println(flattenJson);\n// {a.b=1, a.c=null, a.d[0]=false, a.d[1]=true, e=f, g=2.3}\n```\n\nFlatten to JSON string\n```java\nString jsonStr = JsonFlattener.flatten(json);\n\nSystem.out.println(jsonStr);\n// {\"a.b\":1,\"a.c\":null,\"a.d[0]\":false,\"a.d[1]\":true,\"e\":\"f\",\"g\":2.3}\n```\n\nUnflatten from JSON string\n```java\nString nestedJson = JsonUnflattener.unflatten(jsonStr);\n\nSystem.out.println(nestedJson);\n// {\"a\":{\"b\":1,\"c\":null,\"d\":[false,true]},\"e\":\"f\",\"g\":2.3}\n```\n\nFlatten or Unflatten with reserved characters\n```java\n// Supports JSON keys which contain dots or square brackets\nString flattendJsonWithDotKey = JsonFlattener.flatten(\"[{\\\"a.a.[\\\":1},2,{\\\"c\\\":[3,4]}]\");\n\nSystem.out.println(flattendJsonWithDotKey);\n// {\"[0][\\\"a.a.[\\\"]\":1,\"[1]\":2,\"[2].c[0]\":3,\"[2].c[1]\":4}\n\nString nestedJsonWithDotKey = JsonUnflattener.unflatten(\n        \"{\\\"[1][0]\\\":2,\\\"[0]\\\":1,\\\"[1][1]\\\":3,\\\"[2]\\\":4,\\\"[3][\\\\\\\"ab.c.[\\\\\\\"]\\\":5}\");\n\t\nSystem.out.println(nestedJsonWithDotKey);\n// [1,[2,3],4,{\"ab.c.[\":5}]\n```\n\n# Feature List\u003ca id='top'\u003e\u003c/a\u003e\n| Name | Description | Since |\n| --- | --- | --- |\n| Jackson, Gson, org.json, Jakarta | Upgrading [json-base](https://github.com/wnameless/json-base) to support 4 major JSON implementations | v0.16.0 |\n| [JsonFlattenerFactory](#14.0.1) | produces any JsonFlattener with preconfigured settings | v0.14.0 |\n| [JsonUnflattenerFactory](#14.0.2) | produces any JsonUnflattener with preconfigured settings | v0.14.0 |\n| [IgnoreReservedCharacters](#13.0.1) | reserved characters in keys can be ignored | v0.13.0 |\n| [JsonCore](#12.0.1) | customized JSON libarary(Jackson, GSON, etc.) supported | v0.12.0 |\n| [JsonUnflattener.unflatten(Map)](#11.0.1) | new API for Java Map unflattening | v0.11.0 |\n| [JsonUnflattener.unflattenAsMap](#11.0.2) | new API for JSON unflattening | v0.11.0 |\n| [JsonFlattener.flattenAsMap(JsonValueBase)](#8.1.1) | new API for JSON flattening | v0.8.1 |\n| [FlattenMode.KEEP_PRIMITIVE_ARRAYS](#8.0.1) | new FlattenMode to keep all primitive JSON arrrays | v0.8.0 |\n| [JsonValueBase](#7.0.1)| comes from json-base lib, is introduced to improve performance | v0.7.0 |\n| [StringEscapePolicy](#6.0.1) | ALL, ALL_BUT_SLASH, ALL_BUT_UNICODE, ALL_BUT_SLASH_AND_UNICODE, DEFAULT | v0.6.0 |\n| [CharSequenceTranslatorFactory](#5.0.1) | customized StringEscapePolicy | v0.5.0 |\n| [FlattenMode.MONGODB](#4.0.1) | dot notation | v0.4.0 |\n| [KeyTransformer](#4.0.2) | manipulates keys before flattening  | v0.4.0 |\n| [LeftAndRightBrackets](#3.0.1) | customized brackets | v0.3.0 |\n| [Reader](#3.0.2) | input JSON as Java Reader | v0.3.0 |\n| [FlattenMode](#2.0.1) | NORMAL, KEEP_ARRAYS | v0.2.0 |\n| [StringEscapePolicy](#2.0.2) | NORMAL, ALL_UNICODES | v0.2.0 |\n| [Separator](#2.0.3) | customized separator | v0.2.0 |\n| [PrintMode](#2.0.4) | MINIMAL, PRETTY | v0.2.0 |\n\n### [:top:](#top) JsonFlattenerFactory\u003ca id='14.0.1'\u003e\u003c/a\u003e - produces any JsonFlattener with preconfigured settings\n```java\n// Inside Spring configuration class\n@Bean\npublic JsonFlattenerFactory jsonFlattenerFactory() {\n  // Changes the default PrintMode from MINIMAL to PRETTY\n  Consumer\u003cJsonFlattener\u003e configurer = jf -\u003e jf.withPrintMode(PrintMode.PRETTY);\n  // Alters the default JsonCore from Jackson to GSON\n  JsonCore\u003c?\u003e jsonCore = new GsonJsonCore();\n\n  return new JsonFlattenerFactory(configurer, jsonCore);\n}\n\n// In any other Spring environment class\n@Autowired\nJsonFlattenerFactory jsonFlattenerFactory;\n\npublic void usageExamples(String json) {\n  JsonFlattener jf1 = jsonFlattenerFactory.build(json);\n  JsonFlattener jf2 = jsonFlattenerFactory.build(new StringReader(json));\n  JsonFlattener jf3 = jsonFlattenerFactory.build(new GsonJsonCore().parse(json));\n}\n```\n\n### [:top:](#top) JsonUnflattenerFactory\u003ca id='14.0.2'\u003e\u003c/a\u003e - produces any JsonUnflattener with preconfigured settings\n```java\n// Inside Spring configuration class\n@Bean\npublic JsonUnflattenerFactory jsonUnflattenerFactory() {\n  // Sets the FlattenMode to MONGODB\n  Consumer\u003cJsonUnflattener\u003e configurer = ju -\u003e ju.withFlattenMode(FlattenMode.MONGODB);\n  // Alters the default JsonCore from Jackson to GSON\n  JsonCore\u003c?\u003e jsonCore = new GsonJsonCore();\n\n  return new JsonUnflattenerFactory(configurer, jsonCore);\n}\n\n// In any other Spring environment class\n@Autowired\nJsonUnflattenerFactory jsonUnflattenerFactory;\n\npublic void usageExamples(String json) {\n  JsonUnflattener ju1 = jsonUnflattenerFactory.build(json);\n  JsonUnflattener ju2 = jsonUnflattenerFactory.build(new StringReader(json));\n  JsonUnflattener ju3 = jsonUnflattenerFactory.build((Map\u003cString, ?\u003e) new ObjectMapper().readValue(json, Map.class));\n}\n```\n\n### [:top:](#top) IgnoreReservedCharacters\u003ca id='13.0.1'\u003e\u003c/a\u003e - reserved characters in keys can be ignored\n```java\nString json = \"{\\\"matrix\\\":{\\\"agent.smith\\\":\\\"1999\\\"}}\";\n\nSystem.out.println(JsonFlattener.flatten(json));\n// {\"matrix[\\\"agent.smith\\\"]\":\"1999\"}\n\nSystem.out.println(new JsonFlattener(json).ignoreReservedCharacters().flatten());\n// {\"matrix.agent.smith\":\"1999\"}\n// The escape of reserved character('.') has been ignored\n\nnew JsonFlattener(json).withFlattenMode(FlattenMode.MONGODB).flatten();\n// Throws IllegalArgumentException\n\nSystem.out.println(new JsonFlattener(json).withFlattenMode(FlattenMode.MONGODB).ignoreReservedCharacters().flatten());\n// {\"matrix.agent.smith\":\"1999\"}\n// The check of reserved character('.') has been ignored\n```\n\n### [:top:](#top) JsonCore\u003ca id='12.0.1'\u003e\u003c/a\u003e - customized JSON libarary supported\n```java\nJsonFlattener jf;\nJsonUnflattener ju;\n\nObjectMapper mapper = new ObjectMapper() {\n  {\n    configure(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS, true);\n    configure(DeserializationFeature.USE_BIG_INTEGER_FOR_INTS, true);\n  }\n};\njf = new JsonFlattener(new JacksonJsonCore(mapper), json);\nju = new JsonUnflattener(new JacksonJsonCore(mapper), json);\n\nGson gson = new GsonBuilder().serializeNulls().create();\njf = new JsonFlattener(new GsonJsonCore(gson), json);\nju = new JsonUnflattener(new GsonJsonCore(gson), json);\n```\n\n### [:top:](#top) JsonUnflattener.unflatten(Map)\u003ca id='11.0.1'\u003e\u003c/a\u003e - new API for Java Map unflattening\n```java\nString json = \"{\\\"abc\\\":{\\\"def\\\":[1,2,{\\\"g\\\":{\\\"h\\\":[3]}}]}}\";\nMap\u003cString, Object\u003e flattenedMap = JsonFlattener.flattenAsMap(json);\n\nString unflattenedJson = JsonUnflattener.unflatten(flattenedMap);\n```\n\n### [:top:](#top) JsonUnflattener.unflattenAsMap\u003ca id='11.0.2'\u003e\u003c/a\u003e - new API for JSON unflattening\n```java\nString json = \"{\\\"abc\\\":{\\\"def\\\":[1,2,{\\\"g\\\":{\\\"h\\\":[3]}}]}}\";\nString flattenedJson = JsonFlattener.flatten(json);\nMap\u003cString, Object\u003e flattenedMap = JsonFlattener.flattenAsMap(json);\n\nMap\u003cString, Object\u003e unflattenedMap;\nunflattenedMap = JsonUnflattener.unflattenAsMap(flattenedJson);\nunflattenedMap = JsonUnflattener.unflattenAsMap(flattenedMap);\n```\n\n### [:top:](#top) JsonFlattener.flattenAsMap(JsonValueBase)\u003ca id='8.1.1'\u003e\u003c/a\u003e - new API for JSON flattening\n```java\nJsonValueBase\u003c?\u003e jsonVal;\n\n// JacksonJsonValue, which is provided by json-base lib, can wrap Jackson jsonNode to JsonValueBase\njsonVal = new JacksonJsonValue(jsonNode);\n\nMap\u003cString, Object\u003e flattenMap = JsonFlattener.flattenAsMap(jsonVal);\n```\n\n### [:top:](#top) FlattenMode.KEEP_PRIMITIVE_ARRAYS\u003ca id='8.0.1'\u003e\u003c/a\u003e - new FlattenMode to keep all primitive JSON arrrays\n```java\nString json = \"{\\\"ary\\\":[true,[1, 2, 3],false]}\";\nSystem.out.println(new JsonFlattener(json).withFlattenMode(FlattenMode.KEEP_PRIMITIVE_ARRAYS).flatten());\n// {\"ary[0]\":true,\"ary[1]\":[1,2,3],\"ary[2]\":false}\n```\nThis mode only keeps arrays which contain only primitive types(strings, numbers, booleans, and null).\n\n### [:top:](#top) JsonValueBase\u003ca id='7.0.1'\u003e\u003c/a\u003e - comes from json-base lib, is introduced to improve performance\n```java\nJsonValueBase\u003c?\u003e jsonVal;\n\n// GsonJsonValue, which is provided by json-base lib, can wrap Gson jsonElement to JsonValueBase\njsonVal = new GsonJsonValue(jsonElement);\n\n// JacksonJsonValue, which is provided by json-base lib, can wrap Jackson jsonNode to JsonValueBase\njsonVal = new JacksonJsonValue(jsonNode);\n\n// You can also implement the JsonValueBase interface for any JSON lib you are using\njsonVal = new CostumeJsonValue(yourJsonVal);\n\nnew JsonFlattener(jsonVal);\n```\n\n### [:top:](#top) StringEscapePolicy\u003ca id='6.0.1'\u003e\u003c/a\u003e - ALL, ALL_BUT_SLASH, ALL_BUT_UNICODE, ALL_BUT_SLASH_AND_UNICODE, DEFAULT\n```java\nStringEscapePolicy.ALL //                       Escapes all JSON special characters and Unicode\nStringEscapePolicy.ALL_BUT_SLASH //             Escapes all JSON special characters and Unicode but slash('/')\nStringEscapePolicy.ALL_BUT_UNICODE //           Escapes all JSON special characters but Unicode\nStringEscapePolicy.ALL_BUT_SLASH_AND_UNICODE // Escapes all JSON special characters but slash('/') and Unicode\nStringEscapePolicy.DEFAULT //                   Escapes all JSON special characters but slash('/') and Unicode\n```\n\n### [:top:](#top) CharSequenceTranslatorFactory\u003ca id='5.0.1'\u003e\u003c/a\u003e - customized StringEscapePolicy\n```java\npublic class MyStringEscapePolicy implements CharSequenceTranslatorFactory { ... }\n```\nStringEscapePolicy can be customized by implementing the CharSequenceTranslatorFactory interface.\n\nFor example, if you don't want the slash(/) and backslash(\\\\) to be escaped:\n```java\nnew JsonFlattener(YOUR_JSON)\n\n        .withStringEscapePolicy(new CharSequenceTranslatorFactory() {\n\n          @Override\n          public CharSequenceTranslator getCharSequenceTranslator() {\n            return new AggregateTranslator(\n                new LookupTranslator(new HashMap\u003cCharSequence, CharSequence\u003e() {\n                  private static final long serialVersionUID = 1L;\n                  {\n                    put(\"\\\"\", \"\\\\\\\"\");\n                    // put(\"\\\\\", \"\\\\\\\\\");\n                    // put(\"/\", \"\\\\/\"); \n                  }\n                }), new LookupTranslator(EntityArrays.JAVA_CTRL_CHARS_ESCAPE));\n          }\n\n        });\n```\n\n### [:top:](#top) FlattenMode.MONGODB\u003ca id='4.0.1'\u003e\u003c/a\u003e - dot notation\n```java\nString json = \"{\\\"abc\\\":{\\\"def\\\":[123]}}\";\nSystem.out.println(new JsonFlattener(json).withFlattenMode(FlattenMode.MONGODB).flatten());\n// {\"abc.def.0\":123}\n\njson = \"{\\\"abc.def.0\\\":123}\";\nSystem.out.println(new JsonUnflattener(json).withFlattenMode(FlattenMode.MONGODB).unflatten());\n// {\"abc\":{\"def\":[123]}}\n\n// With FlattenMode.MONGODB, separator can still be changed\njson = \"{\\\"abc\\\":{\\\"def\\\":[123]}}\";\nSystem.out.println(new JsonFlattener(json).withFlattenMode(FlattenMode.MONGODB).withSeparator('*').flatten());\n// {\"abc*def*0\":123}\n\njson = \"{\\\"abc*def*0\\\":123}\";\nSystem.out.println(new JsonUnflattener(json).withFlattenMode(FlattenMode.MONGODB).withSeparator('*').unflatten());\n// {\"abc\":{\"def\":[123]}}\n```\n\n### [:top:](#top) KeyTransformer\u003ca id='4.0.2'\u003e\u003c/a\u003e - manipulates keys before flattening \n```java\nString json = \"{\\\"abc\\\":{\\\"de.f\\\":123}}\";\nJsonFlattener jf = new JsonFlattener(json).withFlattenMode(FlattenMode.MONGODB);\n\n// This will throw an exception because FlattenMode.MONGODB won't support separator(.) in the key\njf.flatten();\n\n// KeyTransformer can be used to manipulate keys before flattening \nKeyTransformer kt = new KeyTransformer() {\n  @Override\n  public String transform(String key) {\n    return key.replace('.', '_');\n  }\n};\njf.withKeyTransformer(kt);\nSystem.out.println(jf.flatten());\n// {\"abc.de_f\":123}\n\n// KeyTransformer should be set in JsonUnflattener as well\njson = \"{\\\"abc.de_f\\\":123}\";\nkt = new KeyTransformer() {\n  @Override\n  public String transform(String key) {\n    return key.replace('_', '.');\n  }\n};\nJsonUnflattener ju = new JsonFlattener(json).withFlattenMode(FlattenMode.MONGODB).withKeyTransformer(kt);\nSystem.out.println(ju.unflatten());\n// {\"abc\":{\"de.f\":123}}\n```\n\n### [:top:](#top) LeftAndRightBrackets\u003ca id='3.0.1'\u003e\u003c/a\u003e - customized brackets\n```java\n// JsonFlattener - Brackets can be changed from square brackets([]) to any 2 arbitrary characters\nString json = \"{\\\"abc\\\":{\\\"def\\\":[123]}}\";\nSystem.out.println(new JsonFlattener(json).withLeftAndRightBrackets('(', ')').flatten());\n// {\"abc.def(0)\":123}\n\n// JsonUnflattener - if special brackets are using, it should be set into the unflattener as well\njson = \"{\"abc.def(0)\":123}\";\nSystem.out.println(new JsonUnflattener(json).withLeftAndRightBrackets('(', ')').unflatten());\n// {\"abc\":{\"def\":[123]}}\n```\n\n### [:top:](#top) Reader\u003ca id='3.0.2'\u003e\u003c/a\u003e - input JSON as Java Reader\n```java\nInputStream inputStream = new FileInputStream(\"simple.json\");\nReader reader = new InputStreamReader(inputStream);\n\n// Support Reader as input \nJsonFlattener jf = new JsonFlattener(reader);\nJsonUnflattener ju = new JsonUnflattener(reader);\n```\n\n### [:top:](#top) FlattenMode\u003ca id='2.0.1'\u003e\u003c/a\u003e - NORMAL, KEEP_ARRAYS\n```java\nString json = \"{\\\"abc\\\":{\\\"def\\\":[1,2,{\\\"g\\\":{\\\"h\\\":[3]}}]}}\";\n\n// FlattenMode.NORMAL(default) - flatten everything\nSystem.out.println(new JsonFlattener(json).withFlattenMode(FlattenMode.NORMAL).flatten());\n// {\"abc.def[0]\":1,\"abc.def[1]\":2,\"abc.def[2].g.h[0]\":3}\n\n// FlattenMode.KEEP_ARRAYS - flatten all except arrays\nSystem.out.println(new JsonFlattener(json).withFlattenMode(FlattenMode.KEEP_ARRAYS).flatten());\n// {\"abc.def\":[1,2,{\"g.h\":[3]}]}\n\n// When the flattened outcome can NOT suit in a Java Map, it will still be put in the Map with \"root\" as its key. \nMap\u003cString, Object\u003e map = new JsonFlattener(\"[[123]]\").withFlattenMode(FlattenMode.KEEP_ARRAYS).flattenAsMap();\nSystem.out.println(map.get(\"root\"));\n// [[123]]\n```\n\n### [:top:](#top) StringEscapePolicy\u003ca id='2.0.2'\u003e\u003c/a\u003e - NORMAL, ALL_UNICODES\n```java\nString json = \"{\\\"abc\\\":{\\\"def\\\":\\\"太極\\\\t\\\"}}\";\n\n// StringEscapePolicy.NORMAL(default) - escape only speacial characters\nSystem.out.println(new JsonFlattener(json).withStringEscapePolicy(StringEscapePolicy.NORMAL).flatten());\n// {\"abc.def\":\"太極\\t\"}\n\n// StringEscapePolicy.ALL_UNICODES - escape speacial characters and unicodes\nSystem.out.println(new JsonFlattener(json).withStringEscapePolicy(StringEscapePolicy.ALL_UNICODES).flatten());\n// {\"abc.def\":\"\\u592A\\u6975\\t\"}\n```\n\n### [:top:](#top) Separator\u003ca id='2.0.3'\u003e\u003c/a\u003e - customized separator\n```java\n// JsonFlattener - separator can be changed from dot(.) to an arbitrary character\nString json = \"{\\\"abc\\\":{\\\"def\\\":123}}\";\nSystem.out.println(new JsonFlattener(json).withSeparator('*').flatten());\n// {\"abc*def\":123}\n\n// JsonUnflattener - if a special separator is using, it should be set into the unflattener as well\njson = \"{\\\"abc*def\\\":123}\";\nSystem.out.println(new JsonUnflattener(json).withSeparator('*').unflatten());\n// {\"abc\":{\"def\":123}}\n```\n\n### [:top:](#top) PrintMode\u003ca id='2.0.4'\u003e\u003c/a\u003e - MINIMAL, PRETTY\n```java\nString json = \"{\\\"abc\\\":{\\\"def\\\":123}}\";\n\n// JsonFlattener\n// PrintMode.MINIMAL(default)\nSystem.out.println(new JsonFlattener(json).withPrintMode(PrintMode.MINIMAL).flatten());\n// {\"abc.def\":123}\n\n// PrintMode.PRETTY\nSystem.out.println(new JsonFlattener(json).withPrintMode(PrintMode.PRETTY).flatten());\n// {\n//   \"abc.def\": 123\n// }\n\n// JsonUnflattener\n// PrintMode.MINIMAL(default)\njson = \"{\\\"abc.def\\\":123}\";\nSystem.out.println(new JsonUnflattener(json).withPrintMode(PrintMode.MINIMAL).unflatten());\n// {\"abc\":{\"def\":123}}\n\n// PrintMode.PRETTY\nSystem.out.println(new JsonUnflattener(json).withPrintMode(PrintMode.PRETTY).unflatten());\n// {\n//   \"abc\": {\n//     \"def\": 123\n//   }\n// }\n```\n\n## MISC\n| Note| Since |\n| --- | --- |\n| Java 8 required. | v0.5.0 |\n| StringEscapePolicy.DEFAULT, which escapes all special characters but slash('/') and Unicode, becomes the default setting. | v0.6.0 |\n| Group ID is changed from [com.github.wnameless] to [com.github.wnameless.json]. | v0.7.0 |\n| Java Module supported. | v0.9.0 |\n| The Map produced by JsonFlattener#flattenAsMap after serialization is now identical to the JSON produced by JsonFlattener#flatten. Before v0.10.0, the serialized flattened Map may be different at some edge cases(ex: input keys contain separator('.')). | v0.10.0 |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwnameless%2Fjson-flattener","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwnameless%2Fjson-flattener","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwnameless%2Fjson-flattener/lists"}