| <!-- |
| /*************************************************************************************************************************** |
| * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations under the License. |
| ***************************************************************************************************************************/ |
| --> |
| |
| Parsing into Generic Models |
| |
| <p> |
| The Juneau parsers are not limited to parsing back into the original bean classes. |
| If the bean classes are not available on the parsing side, the parser can also be used to |
| parse into a generic model consisting of <c>Maps</c>, <c>Collections</c>, and primitive |
| objects. |
| </p> |
| <p> |
| You can parse into any <c>Map</c> type (e.g. <c>HashMap</c>, <c>TreeMap</c>), but |
| using {@link oaj.ObjectMap} is recommended since it has many convenience methods |
| for converting values to various types. |
| The same is true when parsing collections. You can use any Collection (e.g. <c>HashSet</c>, |
| <c>LinkedList</c>) or array (e.g. <c>Object[]</c>, <c>String[]</c>, |
| <c>String[][]</c>), but using {@link oaj.ObjectList} is recommended. |
| </p> |
| <p> |
| When the map or list type is not specified, or is the abstract <c>Map</c>, <c>Collection</c>, |
| or <c>List</c> types, the parser will use <c>ObjectMap</c> and <c>ObjectList</c> by |
| default. |
| </p> |
| <p> |
| For example, given the following JSON: |
| </p> |
| <p class='bpcode w800'> |
| { |
| id: <jk>1</jk>, |
| name: <js>'John Smith'</js>, |
| uri: <js>'http://sample/addressBook/person/1'</js>, |
| addressBookUri: <js>'http://sample/addressBook'</js>, |
| birthDate: <js>'1946-08-12T00:00:00Z'</js>, |
| addresses: [ |
| { |
| uri: <js>'http://sample/addressBook/address/1'</js>, |
| personUri: <js>'http://sample/addressBook/person/1'</js>, |
| id: <jk>1</jk>, |
| street: <js>'100 Main Street'</js>, |
| city: <js>'Anywhereville'</js>, |
| state: <js>'NY'</js>, |
| zip: <jk>12345</jk>, |
| isCurrent: <jk>true</jk> |
| } |
| ] |
| } |
| </p> |
| <p> |
| We can parse this into a generic <c>ObjectMap</c>: |
| </p> |
| <p class='bpcode w800'> |
| <jc>// Parse JSON into a generic POJO model.</jc> |
| ObjectMap m = JsonParser.<jsf>DEFAULT</jsf>.parse(json, ObjectMap.<jk>class</jk>); |
| |
| <jc>// Convert it back to JSON.</jc> |
| String json = SimpleJsonSerializer.<jsf>DEFAULT_READABLE</jsf>.serialize(m); |
| </p> |
| <p> |
| What we end up with is the exact same output. |
| Even the numbers and booleans are preserved because they are parsed into <c>Number</c> and |
| <c>Boolean</c> objects when parsing into generic models. |
| </p> |
| <p class='bpcode w800'> |
| { |
| id: <jk>1</jk>, |
| name: <js>'John Smith'</js>, |
| uri: <js>'http://sample/addressBook/person/1'</js>, |
| addressBookUri: <js>'http://sample/addressBook'</js>, |
| birthDate: <js>'1946-08-12T00:00:00Z'</js>, |
| addresses: [ |
| { |
| uri: <js>'http://sample/addressBook/address/1'</js>, |
| personUri: <js>'http://sample/addressBook/person/1'</js>, |
| id: <jk>1</jk>, |
| street: <js>'100 Main Street'</js>, |
| city: <js>'Anywhereville'</js>, |
| state: <js>'NY'</js>, |
| zip: <jk>12345</jk>, |
| isCurrent: <jk>true</jk> |
| } |
| ] |
| } |
| </p> |
| <p> |
| Once parsed into a generic model, various convenience methods are provided on the <c>ObjectMap</c> |
| and <c>ObjectList</c> classes to retrieve values: |
| </p> |
| <p class='bpcode w800'> |
| <jc>// Parse JSON into a generic POJO model.</jc> |
| ObjectMap m = JsonParser.<jsf>DEFAULT</jsf>.parse(json, ObjectMap.<jk>class</jk>); |
| |
| <jc>// Get some simple values.</jc> |
| String name = m.getString(<js>"name"</js>); |
| <jk>int</jk> id = m.getInt(<js>"id"</js>); |
| |
| <jc>// Get a value convertable from a String.</jc> |
| URI uri = m.get(URI.<jk>class</jk>, <js>"uri"</js>); |
| |
| <jc>// Get a value using a swap.</jc> |
| TemporalCalendarSwap swap = <jk>new</jk> TemporalCalendarSwap.IsoInstant(); |
| Calendar birthDate = m.get(swap, <js>"birthDate"</js>); |
| |
| <jc>// Get the addresses.</jc> |
| ObjectList addresses = m.getObjectList(<js>"addresses"</js>); |
| |
| <jc>// Get the first address and convert it to a bean.</jc> |
| Address address = addresses.get(Address.<jk>class</jk>, 0); |
| </p> |
| |
| <p> |
| As a general rule, parsing into beans is often more efficient than parsing into generic models. |
| And working with beans is often less error prone than working with generic models. |
| </p> |