{"id":21131153,"url":"https://github.com/wnameless/json-base","last_synced_at":"2025-10-19T15:54:18.350Z","repository":{"id":57724059,"uuid":"207088225","full_name":"wnameless/json-base","owner":"wnameless","description":"A set of Java interfaces, which defines the common JSON data behaviors, can be used to decouple programming logic from JSON implementations such as Jackson, Gson, org.json and Jakarta...","archived":false,"fork":false,"pushed_at":"2025-03-29T11:53:42.000Z","size":173,"stargazers_count":5,"open_issues_count":1,"forks_count":3,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-29T12:27:18.728Z","etag":null,"topics":["java","json"],"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":"2019-09-08T09:14:00.000Z","updated_at":"2025-03-29T11:51:20.000Z","dependencies_parsed_at":"2025-03-29T12:33:42.485Z","dependency_job_id":null,"html_url":"https://github.com/wnameless/json-base","commit_stats":null,"previous_names":[],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/wnameless/json-base","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wnameless%2Fjson-base","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wnameless%2Fjson-base/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wnameless%2Fjson-base/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wnameless%2Fjson-base/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wnameless","download_url":"https://codeload.github.com/wnameless/json-base/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wnameless%2Fjson-base/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":264375597,"owners_count":23598413,"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","json"],"created_at":"2024-11-20T05:49:53.372Z","updated_at":"2025-10-19T15:54:18.271Z","avatar_url":"https://github.com/wnameless.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.github.wnameless.json/json-base/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.github.wnameless.json/json-base)\n[![codecov](https://codecov.io/gh/wnameless/json-base/branch/master/graph/badge.svg)](https://codecov.io/gh/wnameless/json-base)\n\njson-base\n=============\nA set of Java interfaces, which defines the common JSON data behaviors, can be used to decouple programming logic from JSON implementations such as Jackson, Gson, org.json and Jakarta... \n\n## Purpose\nTo avoid JSON conversion between different JSON libraries(Jackson, Gson, org.json, Jakarta...) in any JSON consuming Java method by creating generic JSON data interfaces which cover the common JSON data behaviors.\n\n## Feature List\n| Feature | Description |\n| --- | --- |\n| JSON-in JSON-out | Any JSON processing can always be started by JsonCore#parse and ended by Jsonable#toJson |\n| Any JSON implementation is completely decoupled | The JSON implementation can be switched by implementing corresponding interfaces |\n| Popular JSON  implementations are supported by default | Jackson, Gson, org.json, Jakarta |\n| Not involved in any Object serialization or deserialization | The json-base lib just focuses on JSON data itself and nothing more |\n| All special features of the selected JSON implementation are kept  | For example, the Gson object, which is used to create GsonJsonCore, can be configurated in advanced  |\n| All special manipulations, which require original Java types in selected JSON implementation, are capable | For example, the JsonNode object of Jackson library can always be retrieved by calling JsonSource#getSource |\n| Java 9 modularity | This lib supports Java 9 modularity, but keeps Java 8 as the minimum version |\n| Fully tested | The code coverage of json-base is 100% |\n\n## Maven Repo\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.github.wnameless.json\u003c/groupId\u003e\n    \u003cartifactId\u003ejson-base\u003c/artifactId\u003e\n    \u003cversion\u003e${newestVersion}\u003c/version\u003e\n     \u003c!-- Newest version shows in the maven-central badge above --\u003e\n\u003c/dependency\u003e\n```\n\n## Quick Start\nUser can now program zir library logic based on the JSON data wrapper interfaces.\n```java\npublic void acceptJsonVal(JsonValueBase\u003c?\u003e val) {\n  ...\n}\n\n// At the same time, user can consume popular JSON implementations easily in zir library\npublic void acceptJacksonVal(JsonNode jsonNode) {\n  JsonValueCore\u003cJacksonJsonValue\u003e val = new JacksonJsonValue(jsonNode);\n  acceptJsonVal(val);\n  ...\n}\n\npublic void acceptGsonVal(JsonElement jsonElement) {\n  JsonValueCore\u003cGsonJsonValue\u003e val = new GsonJsonValue(jsonElement);\n  acceptJsonVal(val);\n  ...\n}\n\npublic void acceptOrgVal(JSONTokener jsonTokener) {\n  JsonValueCore\u003cOrgJsonValue\u003e val = new OrgJsonValue(jsonTokener);\n  acceptJsonVal(val);\n  ...\n}\n\npublic void acceptJakartaVal(JsonValue jsonValue) {\n  JsonValueCore\u003cJakartaJsonValue\u003e val = new JakartaJsonValue(jsonValue);\n  acceptJsonVal(val);\n  ...\n}\n```\n\nSometimes, you may need a JSON parser in your library. Here is the wrapper:\n```java\n// GsonJsonCore, OrgJsonCore and JakartaJsonCore are also available\nJsonCore\u003c?\u003e jsonCore = new JacksonJsonCore();\nJsonValueCore\u003c?\u003e val = jsonCore.parse(\"{\\\"abc\\\":123}\");\n```\n\nDemo of some operations:\n```java\nJsonObjectCore\u003c?\u003e obj = val.asObject();\nobj.set(\"def\", jsonCore.parse(\"[4.56,true]\"));\n\nif (obj.get(\"abc\").isNumber()) {\n  System.out.println(obj.get(\"abc\").asInt());\n  // 123\n  \n  // User can chose what kind of Java Number zir want to use\n  System.out.println(obj.get(\"abc\").asBigInteger());\n  // 123\n  \n  // The #asNumber method creates a proper Java Number by the size and scale of numeric\n  System.out.println(obj.get(\"abc\").asNumber() instanceof Integer);\n  // true\n}\n\nif (obj.get(\"def\").isArray()) {\n  JsonArrayCore\u003c?\u003e ary = obj.get(\"def\").asArray();\n  System.out.println(ary.get(0).asDouble());\n  // 4.56\n  \n  System.out.println(ary.get(0).asNumber() instanceof Double);\n  // true\n  \n  // Any JsonArrayBase can be converted into a List\n  System.out.println(ary.toList());\n  // [4.56, true]\n}\n\n// Any JsonObjectBase can be converted into a Map\nSystem.out.println(obj.toMap());\n// {abc=123, def=[4.56, true]}\n\n// All JSON data wrapper can be converted into a JSON string\nSystem.out.println(obj.toJson());\n// {\"abc\":123,\"def\":[4.56,true]}\n\n// JsonPrinter can either minimal or pretty print any JSON string\nSystem.out.println(JsonPrinter.prettyPrint(obj.toJson()));\n// {\n//   \"abc\" : 123,\n//   \"def\" : [ 4.56, true ]\n// }\n```\n\n## Important\nAlthough this library provides wrappers for Jackson, Gson, org.json and Jakarta, you still need to include the JSON implementation library which you are using in your dependencies.\n\n## JSON data common interfaces\nIf user wants to implement zir own JSON data wrappers, here are some interfaces to work with.\n\nFor immutable JSON data: JsonValueBase, JsonArrayBase, JsonObjectBase \u003cbr\u003e\nFor mutable JSON data: JsonCore, JsonValueCore, JsonArrayCore, JsonObjectCore\n### JsonCore\n```java\npublic interface JsonCore\u003cJVC extends JsonValueCore\u003c?\u003e\u003e {\n\n  JsonValueCore\u003cJVC\u003e parse(String json);\n\n  JsonValueCore\u003cJVC\u003e parse(Reader jsonReader) throws IOException;\n\n}\n```\n\n### JsonValueBase\n```java\npublic interface JsonValueBase\u003cJVB extends JsonValueBase\u003c?\u003e\u003e extends Jsonable {\n\n  public boolean isObject();\n\n  public boolean isArray();\n\n  public boolean isString();\n\n  public boolean isBoolean();\n\n  public boolean isNumber();\n\n  public boolean isNull();\n\n  public JsonObjectBase\u003cJVB\u003e asObject();\n\n  public JsonArrayBase\u003cJVB\u003e asArray();\n\n  public JsonValueBase\u003cJVB\u003e asValue();\n\n  public String asString();\n\n  public boolean asBoolean();\n\n  public int asInt();\n\n  public long asLong();\n\n  public BigInteger asBigInteger();\n\n  public double asDouble();\n\n  public BigDecimal asBigDecimal();\n\n  default Number asNumber() {\n    return JsonValueUtils.toJavaNumber(asBigDecimal());\n  }\n\n  default Object asNull() {\n    return null;\n  }\n\n}\n```\n\n### JsonValueCore\n```java\npublic interface JsonValueCore\u003cJVC extends JsonValueCore\u003c?\u003e\u003e\n    extends JsonValueBase\u003cJVC\u003e, JsonSource {\n\n  JsonObjectCore\u003cJVC\u003e asObject();\n\n  JsonArrayCore\u003cJVC\u003e asArray();\n\n  JsonValueCore\u003cJVC\u003e asValue();\n\n}\n```\n\n### JsonArrayBase\n```java\npublic interface JsonArrayBase\u003cJVB extends JsonValueBase\u003c?\u003e\u003e\n    extends Iterable\u003cJVB\u003e, JsonValueBase\u003cJVB\u003e {\n\n  JVB get(int index);\n\n  int size();\n\n  default boolean isEmpty() {\n    return !iterator().hasNext();\n  }\n\n  default List\u003cObject\u003e toList() {\n    return JsonValueUtils.toList(this);\n  }\n  \n  default Stream\u003cJVB\u003e stream() {\n    return StreamSupport.stream(spliterator(), false);\n  }\n\n}\n```\n\n### JsonArrayCore\n```java\npublic interface JsonArrayCore\u003cJVC extends JsonValueCore\u003c?\u003e\u003e\n    extends JsonArrayBase\u003cJVC\u003e, JsonValueCore\u003cJVC\u003e {\n\n  void add(JsonSource jsonSource);\n\n  void set(int index, JsonSource jsonSource);\n\n  boolean remove(int index);\n\n}\n```\n\n### JsonObjectBase\n```java\npublic interface JsonObjectBase\u003cJVB extends JsonValueBase\u003c?\u003e\u003e\n    extends Iterable\u003cEntry\u003cString, JVB\u003e\u003e, JsonValueBase\u003cJVB\u003e {\n\n  Iterator\u003cString\u003e names();\n\n  boolean contains(String name);\n\n  JVB get(String name);\n\n  int size();\n\n  default boolean isEmpty() {\n    return !iterator().hasNext();\n  }\n\n  default Map\u003cString, Object\u003e toMap() {\n    return JsonValueUtils.toMap(this);\n  }\n  \n  default Stream\u003cEntry\u003cString, JVB\u003e\u003e stream() {\n    return StreamSupport.stream(spliterator(), false);\n  }\n\n}\n```\n\n### JsonObjectCore\n```java\npublic interface JsonObjectCore\u003cJVC extends JsonValueCore\u003c?\u003e\u003e\n    extends JsonObjectBase\u003cJVC\u003e, JsonValueCore\u003cJVC\u003e {\n\n  void set(String name, JsonSource jsonSource);\n\n  boolean remove(String name);\n\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwnameless%2Fjson-base","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwnameless%2Fjson-base","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwnameless%2Fjson-base/lists"}