blob: 81af5a226c9268b4e5667edee6a771d11635ee9b [file] [log] [blame]
/*******************************************************************************
* 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.apache.ofbiz.base.lang;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import org.apache.commons.io.IOUtils;
import org.apache.ofbiz.base.util.Assert;
import com.fasterxml.jackson.databind.ObjectMapper;
/** A JSON object. */
@ThreadSafe
public final class JSON {
// TODO: Find a generic way to modify mapper options
private static final ObjectMapper mapper = new ObjectMapper();
/**
* Creates a <code>JSON</code> instance from an <code>InputStream</code>.
* The method assumes the character set is UTF-8.
*
* @param inStream
* @return a <code>JSON</code> instance
* @throws IOException
*/
public static JSON from(InputStream inStream) throws IOException {
Assert.notNull("inStream", inStream);
String jsonString = IOUtils.toString(inStream, "UTF-8");
return from(jsonString);
}
/**
* Creates a <code>JSON</code> instance from an unknown data type.
*
* @param object
* @return a <code>JSON</code> instance
* @throws IOException
*/
public static JSON from(Object object) throws IOException {
Assert.notNull("object", object);
try {
return from(mapper.writeValueAsString(object));
} catch (Exception e) {
throw new IOException(e);
}
}
/**
* Creates a <code>JSON</code> instance from a <code>Reader</code>.
*
* @param reader
* @return a <code>JSON</code> instance
* @throws IOException
*/
public static JSON from(Reader reader) throws IOException {
Assert.notNull("reader", reader);
String jsonString = IOUtils.toString(reader);
return from(jsonString);
}
/**
* Creates a <code>JSON</code> instance from a <code>String</code>.
*
* @param jsonString
* @return a <code>JSON</code> instance
*/
public static JSON from(String jsonString) {
Assert.notNull("jsonString", jsonString);
// TODO: Validate String
return new JSON(jsonString);
}
private final String jsonString;
private JSON(String jsonString) {
this.jsonString = jsonString;
}
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (obj instanceof JSON) {
return jsonString.equals(((JSON)obj).jsonString);
}
return false;
}
@Override
public int hashCode() {
return jsonString.hashCode();
}
/**
* Converts this <code>JSON</code> object to the specified type.
*
* @param targetClass
* @return an object of the specified type
* @throws IOException
*/
public <T> T toObject(Class<T> targetClass) throws IOException {
Assert.notNull("targetClass", targetClass);
try {
return mapper.readValue(jsonString, targetClass);
} catch (IOException e) {
throw e;
} catch (Exception e) {
throw new IOException(e);
}
}
@Override
public String toString() {
return jsonString;
}
}