/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package com.juniform;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;
import org.json.simple.parser.ParseException;
/**
* Class that converts from JUniformObject to JSONValue and back
* @author acherkashin
*/
public class JUniformPackerJSON implements IJUniformPacker
{
// ---------------------------------------------------------------------- //
// PUBLIC
// ---------------------------------------------------------------------- //
@Override
public JUniformObject toUniformObjectFromStream(InputStream stream) {
try (InputStreamReader inputStreamReader = new InputStreamReader(stream)) {
Object value = JSONValue.parseWithException(inputStreamReader);
return this.toUniformObjectFromObject(value);
}
catch(IOException | ParseException ex) {
return JUniformObject.OBJECT_NIL;
}
}
@Override
public JUniformObject toUniformObjectFromString(String string) {
try {
Object value = JSONValue.parseWithException(string);
return this.toUniformObjectFromObject(value);
} catch(ParseException ex) {
return JUniformObject.OBJECT_NIL;
}
}
@Override
public JUniformObject toUniformObjectFromBytes(byte[] bytes) {
ByteBuffer buffer = ByteBuffer.wrap(bytes);
return this.toUniformObjectFromString(Charset.defaultCharset().decode(buffer).toString());
}
@Override
public JUniformObject toUniformObjectFromObject(Object object) {
if (object == null) {
return JUniformObject.OBJECT_NIL;
} else if (object instanceof JSONObject) {
JSONObject jsonMap = (JSONObject)object;
Map<Object,Object> map = new HashMap<>();
Iterator it = jsonMap.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pair = (Map.Entry)it.next();
map.put(pair.getKey(), this.toUniformObjectFromObject(pair.getValue()));
}
return new JUniformObject(map);
} else if (object instanceof JSONArray) {
JSONArray jsonArray = (JSONArray)object;
ArrayList<Object> array = new ArrayList<>();
@SuppressWarnings("unchecked")
Iterator<Object> it = jsonArray.iterator();
while(it.hasNext()) {
array.add(this.toUniformObjectFromObject(it.next()));
}
return new JUniformObject(array);
} else {
return new JUniformObject(object);
}
}
@Override
public Object fromUniformObject(JUniformObject object) {
return this._toJSON(object);
}
@Override
public String fromUniformObjectToString(JUniformObject object) {
return JSONValue.toJSONString(this._toJSON(object));
}
@Override
public byte[] fromUniformObjectToByteArray(JUniformObject object) {
return this.fromUniformObjectToString(object).getBytes();
}
// ---------------------------------------------------------------------- //
// PRIVATE
// ---------------------------------------------------------------------- //
@SuppressWarnings("unchecked")
private Object _toJSON(JUniformObject object) {
if (object == null) {
return null;
} else if (object.isMapValue()) {
JSONObject jsonMap = new JSONObject();
Iterator<Map.Entry<Object,JUniformObject>> it = object.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<Object,JUniformObject> pair = it.next();
jsonMap.put(pair.getKey(), this._toJSON(pair.getValue()));
}
return jsonMap;
} else if (object.isArrayValue()) {
JSONArray jsonArray = new JSONArray();
Iterator<JUniformObject> it = object.iterator();
while(it.hasNext()) {
jsonArray.add(this._toJSON(it.next()));
}
return jsonArray;
} else {
return object.getValue();
}
}
}