/* * Copyright (c) 2013 by Yidong Fang * * 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. */ package org.jooq.tools.json; import java.io.IOException; import java.io.Writer; import java.util.HashMap; import java.util.Iterator; import java.util.Map; /** * A JSON object. Key value pairs are unordered. JSONObject supports * java.util.Map interface. * * @author FangYidong<fangyidong@yahoo.com.cn> */ @SuppressWarnings({ "serial", "rawtypes", "unchecked" }) public class JSONObject extends HashMap{ public JSONObject() { super(); } public JSONObject(Map map) { super(map); } /** * Encode a map into JSON text and write it to out. * * @see JSONValue#writeJSONString(Object, Writer) */ public static void writeJSONString(Map<?, ?> map, Writer out) throws IOException { if (map == null) { out.write("null"); return; } boolean first = true; Iterator<?> iter = map.entrySet().iterator(); out.write('{'); while (iter.hasNext()) { if (first) first = false; else out.write(','); Map.Entry<?, ?> entry = (Map.Entry<?, ?>) iter.next(); out.write('\"'); out.write(escape(String.valueOf(entry.getKey()))); out.write('\"'); out.write(':'); JSONValue.writeJSONString(entry.getValue(), out); } out.write('}'); } /** * Convert a map to JSON text. The result is a JSON object. * * @see JSONValue#toJSONString(Object) * @return JSON text, or "null" if map is null. */ public static String toJSONString(Map<?, ?> map) { if (map == null) return "null"; StringBuffer sb = new StringBuffer(); boolean first = true; Iterator<?> iter = map.entrySet().iterator(); sb.append('{'); while (iter.hasNext()) { if (first) first = false; else sb.append(','); Map.Entry<?, ?> entry = (Map.Entry<?, ?>) iter.next(); toJSONString(String.valueOf(entry.getKey()), entry.getValue(), sb); } sb.append('}'); return sb.toString(); } private static String toJSONString(String key, Object value, StringBuffer sb) { sb.append('\"'); if (key == null) sb.append("null"); else JSONValue.escape(key, sb); sb.append('\"').append(':'); sb.append(JSONValue.toJSONString(value)); return sb.toString(); } public static String toString(String key, Object value) { StringBuffer sb = new StringBuffer(); toJSONString(key, value, sb); return sb.toString(); } @Override public String toString() { return toJSONString(this); } /** * Escape quotes, \, /, \r, \n, \b, \f, \t and other control characters * (U+0000 through U+001F). It's the same as JSONValue.escape() only for * compatibility here. * * @see JSONValue#escape(String) */ public static String escape(String s) { return JSONValue.escape(s); } }