- Notifications
You must be signed in to change notification settings - Fork0
A reference implementation of a JSON package in Java.
License
gdmanandamohon/JSON-java
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
image credit: Ismael Pérez Ortiz
Click here if you just want the latest release jar file.
JSON is a light-weight language-independent data interchange format.
The JSON-Java package is a reference implementation that demonstrates how to parse JSON documents into Java objects and how to generate new JSON documents from the Java classes.
Project goals include:
- Reliable and consistent results
- Adherence to the JSON specification
- Easy to build, use, and include in other projects
- No external dependencies
- Fast execution and low memory footprint
- Maintain backward compatibility
- Designed and tested to use on Java versions 1.6 - 1.11
The files in this package implement JSON encoders and decoders. The package can also convert between JSON and XML, HTTP headers, Cookies, and CDL.
The license includes this restriction:"The software shall be used for good, not evil." If your conscience cannot live with that, then choose a different package.
For more information on contributions, please seeCONTRIBUTING.md
Bug fixes, code improvements, and unit test coverage changes are welcome! Because this project is currently in the maintenance phase, the kinds of changes that can be accepted are limited. For more information, please read theFAQ.
The org.json package can be built from the command line, Maven, and Gradle. The unit tests can be executed from Maven, Gradle, or individually in an IDE e.g. Eclipse.
Building from the command line
Build the class files from the package root directory src/main/java
javac org/json/*.javaCreate the jar file in the current directory
jar cf json-java.jar org/json/*.classCompile a program that uses the jar (see example code below)
javac -cp .;json-java.jar Test.javaTest file contents
import org.json.JSONObject;public class Test { public static void main(String args[]){ JSONObject jo = new JSONObject("{ \"abc\" : \"def\" }"); System.out.println(jo.toString()); }}Execute the Test file
java -cp .;json-java.jar TestExpected output
{"abc":"def"}Tools to build the package and execute the unit tests
Execute the test suite with Maven:
mvn clean testExecute the test suite with Gradlew:
gradlew clean build testRecent directory structure change
Due to a recent commit -#515 Merge tests and pom and code - the structure of the project has changed from a flat directory containing all of the Java files to a directory structure that includes unit tests and several tools used to build the project jar and run the unit tests. If you have difficulty using the new structure, please open an issue so we can work through it.
Implementation notes
Numeric types in this package comply withECMA-404: The JSON Data Interchange Format andRFC 8259: The JavaScript Object Notation (JSON) Data Interchange Format.This package fully supportsInteger,Long, andDouble Java types. Partial supportforBigInteger andBigDecimal values inJSONObject andJSONArray objects is providedin the form ofget(),opt(), andput() API methods.
Although 1.6 compatibility is currently supported, it is not a project goal and might beremoved in some future release.
In compliance with RFC8259 page 10 section 9, the parser is more lax with what is validJSON then the Generator. For Example, the tab character (U+0009) is allowed when readingJSON Text strings, but when output by the Generator, the tab is properly converted to \t inthe string. Other instances may occur where reading invalid JSON text does not cause anerror to be generated. Malformed JSON Texts such as missing end " (quote) on strings orinvalid number formats (1.2e6.3) will cause errors as such documents can not be readreliably.
Some notable exceptions that the JSON Parser in this library accepts are:
- Unquoted keys
{ key: "value" } - Unquoted values
{ "key": value } - Unescaped literals like "tab" in string values
{ "key": "value with an unescaped tab" } - Numbers out of range for
DoubleorLongare parsed as strings
Recent pull requests added a new methodputAll on the JSONArray. TheputAll methodworks similarly to otherput methods in that it does not callJSONObject.wrap for itemsadded. This can lead to inconsistent object representation in JSONArray structures.
For example, code like this will create a mixed JSONArray, some items wrapped, othersnot:
SomeBean[]myArr =newSomeBean[]{newSomeBean(1),newSomeBean(2) };// these will be wrappedJSONArrayjArr =newJSONArray(myArr);// these will not be wrappedjArr.putAll(newSomeBean[]{newSomeBean(3),newSomeBean(4) });
For structure consistency, it would be recommended that the above code is changedto look like 1 of 2 ways.
Option 1:
SomeBean[]myArr =newSomeBean[]{newSomeBean(1),newSomeBean(2) };JSONArrayjArr =newJSONArray();// these will not be wrappedjArr.putAll(myArr);// these will not be wrappedjArr.putAll(newSomeBean[]{newSomeBean(3),newSomeBean(4) });// our jArr is now consistent.
Option 2:
SomeBean[]myArr =newSomeBean[]{newSomeBean(1),newSomeBean(2) };// these will be wrappedJSONArrayjArr =newJSONArray(myArr);// these will be wrappedjArr.putAll(newJSONArray(newSomeBean[]{newSomeBean(3),newSomeBean(4) }));// our jArr is now consistent.
Unit Test Conventions
Test filenames should consist of the name of the module being tested, with the suffix "Test".For example,Cookie.java is tested byCookieTest.java.
The fundamental issues with JSON-Java testing are:
- JSONObjects are unordered, making simple string comparison ineffective.
- Comparisons viaequals() is not currently supported. NeitherJSONArray norJSONObject overridehashCode() orequals(), so comparison defaults to theObject equals(), which is not useful.
- Access to theJSONArray andJSONObject internal containers for comparison is not currently available.
General issues with unit testing are:
- Just writing tests to make coverage goals tends to result in poor tests.
- Unit tests are a form of documentation - how a given method works is demonstrated by the test. So for a code reviewer or future developer looking at code a good test helps explain how a function is supposed to work according to the original author. This can be difficult if you are not the original developer.
- It is difficult to evaluate unit tests in a vacuum. You also need to see the code being tested to understand if a test is good.
- Without unit tests, it is hard to feel confident about the quality of the code, especially when fixing bugs or refactoring. Good tests prevent regressions and keep the intent of the code correct.
- If you have unit test results along with pull requests, the reviewer has an easier time understanding your code and determining if it works as intended.
JSONObject.java: TheJSONObject can parse text from aString or aJSONTokenerto produce a map-like object. The object provides methods for manipulating itscontents, and for producing a JSON compliant object serialization.
JSONArray.java: TheJSONArray can parse text from a String or aJSONTokenerto produce a vector-like object. The object provides methods for manipulatingits contents, and for producing a JSON compliant array serialization.
JSONTokener.java: TheJSONTokener breaks a text into a sequence of individualtokens. It can be constructed from aString,Reader, orInputStream. It also canparse text from aString,Number,Boolean ornull like"hello",42,true,null to produce a simple json object.
JSONException.java: TheJSONException is the standard exception type thrownby this package.
JSONPointer.java: Implementation ofJSON Pointer (RFC 6901). SupportsJSON Pointers both in the form of string representation and URI fragmentrepresentation.
JSONPropertyIgnore.java: Annotation class that can be used on Java Bean getter methods.When used on a bean method that would normally be serialized into aJSONObject, itoverrides the getter-to-key-name logic and forces the property to be excluded from theresultingJSONObject.
JSONPropertyName.java: Annotation class that can be used on Java Bean getter methods.When used on a bean method that would normally be serialized into aJSONObject, itoverrides the getter-to-key-name logic and uses the value of the annotation. The Beanprocessor will look through the class hierarchy. This means you can use the annotation ona base class or interface and the value of the annotation will be used even if the getteris overridden in a child class.
JSONString.java: TheJSONString interface requires atoJSONString method,allowing an object to provide its own serialization.
JSONStringer.java: TheJSONStringer provides a convenient facility forbuilding JSON strings.
JSONWriter.java: TheJSONWriter provides a convenient facility for buildingJSON text through a writer.
CDL.java:CDL provides support for converting between JSON and commadelimited lists.
Cookie.java:Cookie provides support for converting between JSON and cookies.
CookieList.java:CookieList provides support for converting between JSON andcookie lists.
HTTP.java:HTTP provides support for converting between JSON and HTTP headers.
HTTPTokener.java:HTTPTokener extendsJSONTokener for parsing HTTP headers.
XML.java:XML provides support for converting between JSON and XML.
JSONML.java:JSONML provides support for converting between JSONML and XML.
XMLTokener.java:XMLTokener extendsJSONTokener for parsing XML text.
JSON-java releases can be found by searching the Maven repository for groupId "org.json"and artifactId "json". For example:https://search.maven.org/search?q=g:org.json%20AND%20a:json&core=gav
20210307 Recent commits and potentially breaking fix to JSONPointer20201115 Recent commits and first release after project structure change20200518 Recent commits and snapshot before project structure change20190722 Recent commits20180813 POM change to include Automatic-Module-Name (#431)20180130 Recent commits20171018 Checkpoint for recent commits.20170516 Roll up recent commits.20160810 Revert code that was breaking opt*() methods.20160807 This release contains a bug in the JSONObject.opt*() and JSONArray.opt*() methods,it is not recommended for use.Java 1.6 compatability fixed, JSONArray.toList() and JSONObject.toMap(),RFC4180 compatibility, JSONPointer, some exception fixes, optional XML type conversion.Contains the latest code as of 7 Aug 201620160212 Java 1.6 compatibility, OSGi bundle. Contains the latest code as of 12 Feb 2016.20151123 JSONObject and JSONArray initialization with generics. Contains the latest code as of 23 Nov 2015.20150729 Checkpoint for Maven central repository release. Contains the latest codeas of 29 July 2015.About
A reference implementation of a JSON package in Java.
Resources
License
Contributing
Security policy
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Packages0
Languages
- Java100.0%
