/* * Copyright (C) 2011 Google Inc. * * Licensed 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. */ package cn.emay.sdk.util.json.gson; import java.io.IOException; import java.io.Reader; import java.io.StringReader; import java.io.StringWriter; import java.io.Writer; import cn.emay.sdk.util.json.gson.internal.bind.JsonTreeReader; import cn.emay.sdk.util.json.gson.internal.bind.JsonTreeWriter; import cn.emay.sdk.util.json.gson.stream.JsonReader; import cn.emay.sdk.util.json.gson.stream.JsonToken; import cn.emay.sdk.util.json.gson.stream.JsonWriter; /** * Converts Java objects to and from JSON. * *
 * {
 * 	@code
 *
 * 	public class PointAdapter extends TypeAdapter {
 * 		public Point read(JsonReader reader) throws IOException {
 * 			if (reader.peek() == JsonToken.NULL) {
 * 				reader.nextNull();
 * 				return null;
 * 			}
 * 			String xy = reader.nextString();
 * 			String[] parts = xy.split(",");
 * 			int x = Integer.parseInt(parts[0]);
 * 			int y = Integer.parseInt(parts[1]);
 * 			return new Point(x, y);
 * 		}
 * 
 * 		public void write(JsonWriter writer, Point value) throws IOException {
 * 			if (value == null) {
 * 				writer.nullValue();
 * 				return;
 * 			}
 * 			String xy = value.getX() + "," + value.getY();
 * 			writer.value(xy);
 * 		}
 * 	}
 * }
 *  
 * 
 * With this type adapter installed, Gson will convert {@code Points} to JSON as
 * strings like {@code "5,8"} rather than objects like {@code {"x":5,"y":8}}. In
 * this case the type adapter binds a rich Java class to a compact JSON value.
 *
 * 
 * The {@link #read(JsonReader) read()} method must read exactly one value and
 * {@link #write(JsonWriter,Object) write()} must write exactly one value. For
 * primitive types this is means readers should make exactly one call to
 * {@code nextBoolean()}, {@code nextDouble()}, {@code nextInt()}, {@code
 * nextLong()}, {@code nextString()} or {@code nextNull()}. Writers should make
 * exactly one call to one of value() or nullValue().
 * For arrays, type adapters should start with a call to {@code beginArray()},
 * convert all elements, and finish with a call to {@code endArray()}. For
 * objects, they should start with {@code beginObject()}, convert the object,
 * and finish with {@code endObject()}. Failing to convert a value or converting
 * too many values may cause the application to crash.
 *
 * 
* Type adapters should be prepared to read null from the stream and write it to * the stream. Alternatively, they should use {@link #nullSafe()} method while * registering the type adapter with Gson. If your {@code Gson} instance has * been configured to {@link GsonBuilder#serializeNulls()}, these nulls will be * written to the final document. Otherwise the value (and the corresponding * name when writing to a JSON object) will be omitted automatically. In either * case your type adapter must handle null. * *
* To use a custom type adapter with Gson, you must register it with a * {@link GsonBuilder}: * *
 *    {@code
 *
 *   GsonBuilder builder = new GsonBuilder();
 *   builder.registerTypeAdapter(Point.class, new PointAdapter());
 *   // if PointAdapter didn't check for nulls in its read/write methods, you should instead use
 *   // builder.registerTypeAdapter(Point.class, new PointAdapter().nullSafe());
 *   ...
 *   Gson gson = builder.create();
 * }
 * 
 *
 * @since 2.1
 */
// non-Javadoc:
//
// A type adapter registered with Gson is automatically invoked while // serializing // or deserializing JSON. However, you can also use type adapters directly to // serialize // and deserialize JSON. Here is an example for deserialization:
 {@code
//
// String json = "{'origin':'0,0','points':['1,2','3,4']}";
// TypeAdapter graphAdapter = gson.getAdapter(Graph.class);
// Graph graph = graphAdapter.fromJson(json);
// } 
// And an example for serialization:  {@code
//
// Graph graph = new Graph(...);
// TypeAdapter graphAdapter = gson.getAdapter(Graph.class);
// String json = graphAdapter.toJson(graph);
// } 
//
// Type adapters are type-specific. For example, a {@code
// TypeAdapter
	 * 
	 * 
	 * {
	 * 	@code
	 *
	 * 	Gson gson = new GsonBuilder().registerTypeAdapter(Foo.class, new TypeAdapter
	 * 
	 * You can avoid this boilerplate handling of nulls by wrapping your type
	 * adapter with this method. Here is how we will rewrite the above example:
	 * 
	 * 
	 * {
	 * 	@code
	 *
	 * 	Gson gson = new GsonBuilder().registerTypeAdapter(Foo.class, new TypeAdapter
	 * 
	 * Note that we didn't need to check for nulls in our type adapter after we used
	 * nullSafe.
	 */
	public final TypeAdapter