diff --git a/README.md b/README.md new file mode 100644 index 0000000..982f6e3 --- /dev/null +++ b/README.md @@ -0,0 +1,202 @@ +### Java 7+/Android JSON parser/generator, MIT (c) 2020-2024 miktim@mail.ru + + +Release notes: +\- Java SE 7+/Android RFC 8259 compliant package + (see: https://datatracker.ietf.org/doc/rfc8259/?include_text=1 ); +\- no external dependencies; +\- "JSON" means text in JSON format. JSON text exchanged between systems MUST be encoded using UTF-8 (default charset); +\- "Json" means the Java representation of a JSON object. + +#### package org.miktim.json; + + +### Class JSON. +The class contains static methods for parsing/generating text in JSON format. +\- JSON parser converts JSON text to Java objects: + Json object, String, Number, Boolean, null, Object[ ] array of listed types; +\- when the names within an object are not unique, parser stores the last value only; +\- in addition to listed types, the generator converts Java Lists to JSON arrays and Java Maps to JSON objects. The null key is converted to a "null" member name. +Other Java objects are converted to string representation. + +| Methods: | +| -------- | + +**static Object fromJSON(String jsonText) throws IOException, ParseException** +Parse JSON text + +**static Object fromJSON(InputStream in, String charsetName) throws IOException, ParseException** +Parse text in JSON format from a stream with the specified encoding + +**static String toJSON(Object obj) throws IOException;** +Generate JSON text as single line + +**static String toJSON(Object obj, int space) throws IOException** +Generate the text in JSON format with the specified number of spaces in the indentation + +**static \T toJSON(T obj, OutputStream out, int space, String charsetName) throws IOException** +Generate the text in JSON format into a stream with the specified indentation and encoding + +Methods for converting objects supported by JSON to a Java primitive or an array of Java primitives. +\- sample must be initialized; +\- casting numbers may involve rounding or truncation; +\- casting null to a Java primitive returns corresponding initial value; +\- casting null to an array returns an empty array; +\- casting null to String returns "null"; +\- casting null to other Java objects returns null; +\- casting to null returns null. + + +**static \ T cast(Object obj, T sample) throws ClassCastException** +Cast Java object by sample + +**static \ T cast(Object obj, Class cls) throws ClassCastException** +Cast Java object by class + + +### Class Json extends HashMap . + +This class is a Java representation of a JSON object. +Json member types: +Json object, String, Number, Boolean, null, Object[ ] array of listed types. + +Put, set, get notes: +\- Json object setters accept any Java object, all Java primitives and primitive arrays; +\- RFC 8259 does not recommend using Java BigDecimal and BigInteger as Json member values; +\- AVOID RECURSION!; +\- put, set methods cast Java primitives to the corresponding objects. + Java objects and arrays are stored "as is" (as reference). + For example: float -> Float, int[ ][ ] -> int[ ][ ], String[ ] -> String[ ] +\- after JSON text parsing or normalization, they are stored as: +Double, Object[ ]{Object[ ]{Long,...}, Object[ ]{Long,...}}, Object[ ] {String,...}; +\- getters return null if the member does not exist. + +| Constructors: | +| -------- | + +**Json(Object... members) throws IndexOutOfBoundsException** +Members is a name,value pairs + +**Json(String jsonText) throws IOException, ParseException** +Create Json object from String + +**Json(InputStream inStream) throws IOException, ParseException** +Create Json object from UTF-8 encoded stream. + +| Methods: | +| -------- | + +**String[ ] listNames()** +Returns list of member names + +**boolean exists(String memberName)** +Alias of the inherited containsKey() + +**Object put(String memberName, Object value);** +inherited + +**Json set(Object memberName, Object value);** +Create or replace member. Returns this. + +**Object get(String memberName)** +inherited + +**Object remove(String memberName);** +inherited + +**Object get(String memberName, int... indices) throws IndexOutOfBoundsException** +Returns null, value or array element + +**Json getJson(String memberName, int... indices) throws ClassCastException, IndexOutOfBoundsException** + +**String getString(String memberName, int... indices) throws ClassCastException, IndexOutOfBoundsException** + +**Number getNumber(String memberName, int... indices) throws ClassCastException, IndexOutOfBoundsException** + +**Boolean getBoolean(String memberName, int... indices) throws ClassCastException, IndexOutOfBoundsException** + +**Object[ ] getArray(String memberName, int... indices) throws ClassCastException, IndexOutOfBoundsException** + +**\ T castMember(T sample, String memberName, int... indices) throws ClassCastException, IndexOutOfBoundsException** +Casting Json member value or array element by sample + +**\ T castMember(Class cls, String memberName, int... indices) throws ClassCastException, IndexOutOfBoundsException** +Casting Json member value or array element by Class. see notes for a JSON.cast methods + +**Json normalize() throws IOException, ParseException** +not required to generate JSON text + +**String toString()** +overridden. Returns JSON text as single line + +**String toJSON()** +Stringify Json object as single line + +**String toJSON(String memberName, int... indices)** +Stringify member value or array element as single line + +**Json toJSON(OutputStream outStream) throws IOException** +OutStream is UTF-8 encoded single line JSON text. Returns this + +### Abstract Class JsonObject +Java object extender. Unload/load fields of a Java object to/from a Json object. +\- visibility of object fields as from the object constructor, except for private fields +\- Java transient fields are ignored; +\- Java final fields are unloaded, but not initialized at load; +\- the accessible fields of the object MUST be initialized; +\- see Json set/get/cast rules for Java object fields in the notes for JSON object; +\- arrays of custom objects and collections MUST be managed using replacer/reviewer; +\- it is recommended to create a default constructor + +| Constants: | +| ---------- | + +**protected static final transient Object IGNORED** +Returned from the replacer/reviver methods to skip the field + +| Methods: | +| -------- | + +**Json toJson() throws IllegalArgumentException, IllegalAccessException;** +Returns a Json object from this object + +**\T fromJson(Json jsonObj) throws IllegalArgumentException, IllegalAccessException;** +Loads Json to this object. Returns this object. + +**Json toJson(Object targetObj) throws IllegalArgumentException, IllegalAccessException;** +Returns a Json object from the target object + +**\ T fromJson(T targetObj, Json json) throws IllegalArgumentException, IllegalAccessException;** + Loads Json to target object. Returns target object. + +**protected Object replacer(String name, Object value);** +Applies on unloading: +\- name is object field class and name delimitet with dot (.), value is object field value; +\- first call with the target object class name and the target object as the value; +\- returns Json-supported object or IGNORED + +**protected Object reviver(String name, Object value);** +Applies on loading: +\- name is object field class and name delimited with dot (.), value is Json-supported object +\- first call with the target object class name and Json object as value +\- returns a value that is compatible with the object field or IGNORED + +**protected T getTarget( );** +Get target object. Accessible from replacer/reviver + + +**String toString( );** +Overridden. Generate JSON text as a single line + +**static boolean isClassName(String name);** + +**protected \ T castMember(String memberName, Json jsonObj, T sample);** +Returns the sample if Json member does not exists or is null + + +Usage see: + ./test/json/JsonTest.java + ./test/json/JsonCastTest.java + ./test/json/JsonObjectTest.java diff --git a/readme.css b/readme.css new file mode 100644 index 0000000..0d4e4e2 --- /dev/null +++ b/readme.css @@ -0,0 +1,9 @@ +td, th { + padding: 0px 5px; +/* border: 1px solid black;*/ + text-overflow: clip; + font-weight: normal; +} +th { + background-color: LightGray; +}