1# Overview 2 3This project contains the general-purpose data-binding functionality 4and tree-model for [Jackson Data Processor](http://wiki.fasterxml.com/JacksonHome). 5It builds on [core streaming parser/generator](../../../jackson-core) package, 6and uses [Jackson Annotations](../../../jackson-annotations) for configuration. 7Project is licensed under [Apache License 2.0](http://www.apache.org/licenses/LICENSE-2.0). 8 9While the original use case for Jackson was JSON data-binding, it can now be used for other data formats as well, as long as parser and generator implementations exist. 10Naming of classes uses word 'JSON' in many places even though there is no actual hard dependency to JSON format. 11 12[](https://travis-ci.org/FasterXML/jackson-databind) [](https://maven-badges.herokuapp.com/maven-central/com.fasterxml.jackson.core/jackson-databind) 13[](http://www.javadoc.io/doc/com.fasterxml.jackson.core/jackson-databind) 14[](https://coveralls.io/github/FasterXML/jackson-databind?branch=master) 15 16----- 17 18# Get it! 19 20## Maven 21 22Functionality of this package is contained in Java package `com.fasterxml.jackson.databind`, and can be used using following Maven dependency: 23 24```xml 25<properties> 26 ... 27 <!-- Use the latest version whenever possible. --> 28 <jackson.version>2.10.0</jackson.version> 29 ... 30</properties> 31 32<dependencies> 33 ... 34 <dependency> 35 <groupId>com.fasterxml.jackson.core</groupId> 36 <artifactId>jackson-databind</artifactId> 37 <version>${jackson.version}</version> 38 </dependency> 39 ... 40</dependencies> 41``` 42 43Since package also depends on `jackson-core` and `jackson-annotations` packages, you will need to download these if not using Maven; and you may also want to add them as Maven dependency to ensure that compatible versions are used. 44If so, also add: 45 46```xml 47<dependencies> 48 ... 49 <dependency> 50 <!-- Note: core-annotations version x.y.0 is generally compatible with 51 (identical to) version x.y.1, x.y.2, etc. --> 52 <groupId>com.fasterxml.jackson.core</groupId> 53 <artifactId>jackson-annotations</artifactId> 54 <version>${jackson.version}</version> 55 </dependency> 56 <dependency> 57 <groupId>com.fasterxml.jackson.core</groupId> 58 <artifactId>jackson-core</artifactId> 59 <version>${jackson.version}</version> 60 </dependency> 61 ... 62<dependencies> 63``` 64 65but note that this is optional, and only necessary if there are conflicts between jackson core dependencies through transitive dependencies. 66 67## Non-Maven 68 69For non-Maven use cases, you download jars from [Central Maven repository](http://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/). 70 71Databind jar is also a functional OSGi bundle, with proper import/export declarations, so it can be use on OSGi container as is. 72 73----- 74 75# Use It! 76 77More comprehensive documentation can be found from [Jackson-docs](../../../jackson-docs) repository; as well as from [Wiki](../../wiki) of this project. 78But here are brief introductionary tutorials, in recommended order of reading. 79 80## 1 minute tutorial: POJOs to JSON and back 81 82The most common usage is to take piece of JSON, and construct a Plain Old Java Object ("POJO") out of it. So let's start there. With simple 2-property POJO like this: 83 84```java 85// Note: can use getters/setters as well; here we just use public fields directly: 86public class MyValue { 87 public String name; 88 public int age; 89 // NOTE: if using getters/setters, can keep fields `protected` or `private` 90} 91``` 92 93we will need a `com.fasterxml.jackson.databind.ObjectMapper` instance, used for all data-binding, so let's construct one: 94 95```java 96ObjectMapper mapper = new ObjectMapper(); // create once, reuse 97``` 98 99The default instance is fine for our use -- we will learn later on how to configure mapper instance if necessary. Usage is simple: 100 101```java 102MyValue value = mapper.readValue(new File("data.json"), MyValue.class); 103// or: 104value = mapper.readValue(new URL("http://some.com/api/entry.json"), MyValue.class); 105// or: 106value = mapper.readValue("{\"name\":\"Bob\", \"age\":13}", MyValue.class); 107``` 108 109And if we want to write JSON, we do the reverse: 110 111```java 112mapper.writeValue(new File("result.json"), myResultObject); 113// or: 114byte[] jsonBytes = mapper.writeValueAsBytes(myResultObject); 115// or: 116String jsonString = mapper.writeValueAsString(myResultObject); 117``` 118 119So far so good? 120 121## 3 minute tutorial: Generic collections, Tree Model 122 123Beyond dealing with simple Bean-style POJOs, you can also handle JDK `List`s, `Map`s: 124 125```java 126Map<String, Integer> scoreByName = mapper.readValue(jsonSource, Map.class); 127List<String> names = mapper.readValue(jsonSource, List.class); 128 129// and can obviously write out as well 130mapper.writeValue(new File("names.json"), names); 131``` 132 133as long as JSON structure matches, and types are simple. 134If you have POJO values, you need to indicate actual type (note: this is NOT needed for POJO properties with `List` etc types): 135 136```java 137Map<String, ResultValue> results = mapper.readValue(jsonSource, 138 new TypeReference<Map<String, ResultValue>>() { } ); 139// why extra work? Java Type Erasure will prevent type detection otherwise 140``` 141 142(note: no extra effort needed for serialization, regardless of generic types) 143 144But wait! There is more! 145 146While dealing with `Map`s, `List`s and other "simple" Object types (Strings, Numbers, Booleans) can be simple, Object traversal can be cumbersome. 147This is where Jackson's [Tree model](https://github.com/FasterXML/jackson-databind/wiki/JacksonTreeModel) can come in handy: 148 149```java 150// can be read as generic JsonNode, if it can be Object or Array; or, 151// if known to be Object, as ObjectNode, if array, ArrayNode etc: 152ObjectNode root = mapper.readTree("stuff.json"); 153String name = root.get("name").asText(); 154int age = root.get("age").asInt(); 155 156// can modify as well: this adds child Object as property 'other', set property 'type' 157root.with("other").put("type", "student"); 158String json = mapper.writeValueAsString(root); 159 160// with above, we end up with something like as 'json' String: 161// { 162// "name" : "Bob", "age" : 13, 163// "other" : { 164// "type" : "student" 165// } 166// } 167``` 168 169Tree Model can be more convenient than data-binding, especially in cases where structure is highly dynamic, or does not map nicely to Java classes. 170 171## 5 minute tutorial: Streaming parser, generator 172 173As convenient as data-binding (to/from POJOs) can be; and as flexible as Tree model can be, there is one more canonical processing model available: incremental (aka "streaming") model. 174It is the underlying processing model that data-binding and Tree Model both build upon, but it is also exposed to users who want ultimate performance and/or control over parsing or generation details. 175 176For in-depth explanation, look at [Jackson Core component](https://github.com/FasterXML/jackson-core). 177But let's look at a simple teaser to whet your appetite. 178 179```java 180JsonFactory f = mapper.getFactory(); // may alternatively construct directly too 181 182// First: write simple JSON output 183File jsonFile = new JsonFile("test.json"); 184JsonGenerator g = f.createGenerator(jsonFile); 185// write JSON: { "message" : "Hello world!" } 186g.writeStartObject(); 187g.writeStringField("message", "Hello world!"); 188g.writeEndObject(); 189g.close(); 190 191// Second: read file back 192JsonParser p = f.createParser(jsonFile); 193 194JsonToken t = p.nextToken(); // Should be JsonToken.START_OBJECT 195t = p.nextToken(); // JsonToken.FIELD_NAME 196if ((t != JsonToken.FIELD_NAME) || !"message".equals(p.getCurrentName())) { 197 // handle error 198} 199t = p.nextToken(); 200if (t != JsonToken.VALUE_STRING) { 201 // similarly 202} 203String msg = p.getText(); 204System.out.printf("My message to you is: %s!\n", msg); 205p.close(); 206 207``` 208 209## 10 minute tutorial: configuration 210 211There are two entry-level configuration mechanisms you are likely to use: 212[Features](https://github.com/FasterXML/jackson-databind/wiki/JacksonFeatures) and [Annotations](https://github.com/FasterXML/jackson-annotations). 213 214### Commonly used Features 215 216Here are examples of configuration features that you are most likely to need to know about. 217 218Let's start with higher-level data-binding configuration. 219 220```java 221// SerializationFeature for changing how JSON is written 222 223// to enable standard indentation ("pretty-printing"): 224mapper.enable(SerializationFeature.INDENT_OUTPUT); 225// to allow serialization of "empty" POJOs (no properties to serialize) 226// (without this setting, an exception is thrown in those cases) 227mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); 228// to write java.util.Date, Calendar as number (timestamp): 229mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); 230 231// DeserializationFeature for changing how JSON is read as POJOs: 232 233// to prevent exception when encountering unknown property: 234mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); 235// to allow coercion of JSON empty String ("") to null Object value: 236mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT); 237``` 238 239In addition, you may need to change some of low-level JSON parsing, generation details: 240 241```java 242// JsonParser.Feature for configuring parsing settings: 243 244// to allow C/C++ style comments in JSON (non-standard, disabled by default) 245// (note: with Jackson 2.5, there is also `mapper.enable(feature)` / `mapper.disable(feature)`) 246mapper.configure(JsonParser.Feature.ALLOW_COMMENTS, true); 247// to allow (non-standard) unquoted field names in JSON: 248mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true); 249// to allow use of apostrophes (single quotes), non standard 250mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true); 251 252// JsonGenerator.Feature for configuring low-level JSON generation: 253 254// to force escaping of non-ASCII characters: 255mapper.configure(JsonGenerator.Feature.ESCAPE_NON_ASCII, true); 256``` 257 258Full set of features are explained on [Jackson Features](https://github.com/FasterXML/jackson-databind/wiki/JacksonFeatures) page. 259 260### Annotations: changing property names 261 262The simplest annotation-based approach is to use `@JsonProperty` annotation like so: 263 264```java 265public class MyBean { 266 private String _name; 267 268 // without annotation, we'd get "theName", but we want "name": 269 @JsonProperty("name") 270 public String getTheName() { return _name; } 271 272 // note: it is enough to add annotation on just getter OR setter; 273 // so we can omit it here 274 public void setTheName(String n) { _name = n; } 275} 276``` 277 278There are other mechanisms to use for systematic naming changes: see [Custom Naming Convention](https://github.com/FasterXML/jackson-databind/wiki/JacksonCustomNamingConvention) for details. 279 280Note, too, that you can use [Mix-in Annotations](https://github.com/FasterXML/jackson-databind/wiki/JacksonMixinAnnotations) to associate all annotations. 281 282### Annotations: Ignoring properties 283 284There are two main annotations that can be used to to ignore properties: `@JsonIgnore` for individual properties; and `@JsonIgnoreProperties` for per-class definition 285 286```java 287// means that if we see "foo" or "bar" in JSON, they will be quietly skipped 288// regardless of whether POJO has such properties 289@JsonIgnoreProperties({ "foo", "bar" }) 290public class MyBean 291{ 292 // will not be written as JSON; nor assigned from JSON: 293 @JsonIgnore 294 public String internal; 295 296 // no annotation, public field is read/written normally 297 public String external; 298 299 @JsonIgnore 300 public void setCode(int c) { _code = c; } 301 302 // note: will also be ignored because setter has annotation! 303 public int getCode() { return _code; } 304} 305``` 306 307As with renaming, note that annotations are "shared" between matching fields, getters and setters: if only one has `@JsonIgnore`, it affects others. 308But it is also possible to use "split" annotations, to for example: 309 310```java 311public class ReadButDontWriteProps { 312 private String _name; 313 @JsonProperty public void setName(String n) { _name = n; } 314 @JsonIgnore public String getName() { return _name; } 315} 316``` 317 318in this case, no "name" property would be written out (since 'getter' is ignored); but if "name" property was found from JSON, it would be assigned to POJO property! 319 320For a more complete explanation of all possible ways of ignoring properties when writing out JSON, check ["Filtering properties"](http://www.cowtowncoder.com/blog/archives/2011/02/entry_443.html) article. 321 322### Annotations: using custom constructor 323 324Unlike many other data-binding packages, Jackson does not require you to define "default constructor" (constructor that does not take arguments). 325While it will use one if nothing else is available, you can easily define that an argument-taking constructor is used: 326 327```java 328public class CtorBean 329{ 330 public final String name; 331 public final int age; 332 333 @JsonCreator // constructor can be public, private, whatever 334 private CtorBean(@JsonProperty("name") String name, 335 @JsonProperty("age") int age) 336 { 337 this.name = name; 338 this.age = age; 339 } 340} 341``` 342 343Constructors are especially useful in supporting use of 344[Immutable objects](http://www.cowtowncoder.com/blog/archives/2010/08/entry_409.html). 345 346Alternatively, you can also define "factory methods": 347 348```java 349public class FactoryBean 350{ 351 // fields etc omitted for brewity 352 353 @JsonCreator 354 public static FactoryBean create(@JsonProperty("name") String name) { 355 // construct and return an instance 356 } 357} 358``` 359 360Note that use of a "creator method" (`@JsonCreator` with `@JsonProperty` annotated arguments) does not preclude use of setters: you 361can mix and match properties from constructor/factory method with ones that 362are set via setters or directly using fields. 363 364## Tutorial: fancier stuff, conversions 365 366One useful (but not very widely known) feature of Jackson is its ability 367to do arbitrary POJO-to-POJO conversions. Conceptually you can think of conversions as sequence of 2 steps: first, writing a POJO as JSON, and second, binding that JSON into another kind of POJO. Implementation just skips actual generation of JSON, and uses more efficient intermediate representation. 368 369Conversions work between any compatible types, and invocation is as simple as: 370 371```java 372ResultType result = mapper.convertValue(sourceObject, ResultType.class); 373``` 374 375and as long as source and result types are compatible -- that is, if to-JSON, from-JSON sequence would succeed -- things will "just work". 376But here are couple of potentially useful use cases: 377 378```java 379// Convert from List<Integer> to int[] 380List<Integer> sourceList = ...; 381int[] ints = mapper.convertValue(sourceList, int[].class); 382// Convert a POJO into Map! 383Map<String,Object> propertyMap = mapper.convertValue(pojoValue, Map.class); 384// ... and back 385PojoType pojo = mapper.convertValue(propertyMap, PojoType.class); 386// decode Base64! (default byte[] representation is base64-encoded String) 387String base64 = "TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz"; 388byte[] binary = mapper.convertValue(base64, byte[].class); 389``` 390 391Basically, Jackson can work as a replacement for many Apache Commons components, for tasks like base64 encoding/decoding, and handling of "dyna beans" (Maps to/from POJOs). 392 393# Contribute! 394 395We would love to get your contribution, whether it's in form of bug reports, Requests for Enhancement (RFE), documentation, or code patches. 396The primary mechanism for all of above is [GitHub Issues system](https://github.com/FasterXML/jackson-databind/issues). 397 398## Basic rules for Code Contributions 399 400There is really just one main rule, which is that to accept any code contribution, we need to get a filled Contributor License Agreement (CLA) from the author. One CLA is enough for any number of contributions, but we need one. Or, rather, companies that use our code want it. It keeps their lawyers less unhappy about Open Source usage. 401 402## Limitation on Dependencies by Core Components 403 404One additional limitation exists for so-called core components (streaming api, jackson-annotations and jackson-databind): no additional dependendies are allowed beyond: 405 406* Core components may rely on any methods included in the supported JDK 407 * Minimum JDK version was 1.5 until (and including) version 2.3 408 * Minimum JDK version was 1.6 for Jackson 2.4 - 2.7 (inclusive) for all core components 409 * Minimum is still 1.6 for `jackson-annotations` and `jackson-core`, for all remaining Jackson 2.x versions 410 * Minimum JDK version is 1.7 for Jackson 2.7 - 2.10 of `jackson-databind` and most non-core components 411* Jackson-databind (this package) depends on the other two (annotations, streaming). 412 413This means that anything that has to rely on additional APIs or libraries needs to be built as an extension, 414usually a Jackson module. 415 416 417## Branches 418 419`master` branch is for developing the next major Jackson version -- 3.0 -- but there 420are active maintenance branches in which much of development happens: 421 422* `2.10` is the current stable minor 2.x version 423* `2.9` is for selected backported fixes 424 425Older branches are usually not maintained after being declared as closed 426on [Jackson Releases](https://github.com/FasterXML/jackson/wiki/Jackson-Releases) page, 427but exist just in case a rare emergency patch is needed. 428All released versions have matching git tags (`jackson-dataformats-binary-2.9.10`). 429 430----- 431 432# Differences from Jackson 1.x 433 434Project contains versions 2.0 and above: source code for earlier (1.x) versions was available from [Codehaus](http://jackson.codehaus.org) SVN repository, but due to Codehaus closure is currently (July 2015) not officially available. 435We may try to create Jackson1x repository at Github in future (if you care about this, ping Jackson team via mailing lists, or file an issue for this project). 436 437Main differences compared to 1.0 "mapper" jar are: 438 439* Maven build instead of Ant 440* Java package is now `com.fasterxml.jackson.databind` (instead of `org.codehaus.jackson.map`) 441 442----- 443 444# Further reading 445 446* [Overall Jackson Docs](../../../jackson-docs) 447* [Project wiki page](https://github.com/FasterXML/jackson-databind/wiki) 448 449Related: 450 451* [Core annotations](https://github.com/FasterXML/jackson-annotations) package defines annotations commonly used for configuring databinding details 452* [Core parser/generator](https://github.com/FasterXML/jackson-core) package defines low-level incremental/streaming parsers, generators 453