/**
*
*/
package org.archive.hadoop.pig.udf;
import java.io.IOException;
import java.util.Map;
import org.apache.pig.EvalFunc;
import org.apache.pig.data.Tuple;
import org.mortbay.util.ajax.JSON;
/**
* A PIG function that translates JSON to Map object.
*
* @author kenji
*/
public class FromJsonFunc extends EvalFunc<Map<String, Object>> {
public FromJsonFunc() {
}
/* (non-Javadoc)
* @see org.apache.pig.EvalFunc#exec(org.apache.pig.data.Tuple)
*/
@SuppressWarnings("unchecked")
@Override
public Map<String, Object> exec(Tuple input) throws IOException {
if (input.size() != 1)
throw new IllegalArgumentException("expects exactly one String argument");
String value = (String)input.get(0);
if (value == null) return null;
try {
Object obj = JSON.parse(value);
if (obj instanceof Map) {
Map<?, ?> asmap = (Map<?, ?>)obj;
for (Object k : asmap.keySet()) {
if (!(k instanceof String)) {
asmap.remove(k);
}
}
return (Map<String, Object>)asmap;
} else {
throw new IOException("JSON '" + value + "' cannot be parsed into a Map");
}
} catch (IllegalStateException ex) {
// JSON.parse() throws IllegalStateException for syntactical errors.
// translate it into IOException.
throw new IOException("failed to parse as JSON:" + value);
}
}
}