@Override public String determineTypeFor(String formatType, Object o) { EJValue jsonValue = (EJValue) o; if (jsonValue.isObject() != null) { EJObject jsonObject = jsonValue.isObject(); if (jsonObject.containsKey(SerializationParts.ENCODED_TYPE)) { return jsonObject.get(SerializationParts.ENCODED_TYPE).isString().stringValue(); } else { return Map.class.getName(); } } else if (jsonValue.isString() != null) { return String.class.getName(); } else if (jsonValue.isNumber() != null) { return Double.class.getName(); } else if (jsonValue.isBoolean() != null) { return Boolean.class.getName(); } else if (jsonValue.isArray() != null) { return List.class.getName(); } else if (jsonValue.isNull()) { return null; } throw new RuntimeException( "unknown type: cannot reverse map value to concrete Java type: " + o); }
protected T doDemarshall(final T impl, final EJValue o, final MarshallingSession ctx) { if (o.isObject() == null) return impl; Object demarshalledKey; final String assumedKeyType = ctx.getAssumedMapKeyType(); final String assumedValueType = ctx.getAssumedMapValueType(); // the assumed map k/v types can only be used once since they are not set for nested maps. ctx.setAssumedMapKeyType(null); ctx.setAssumedMapValueType(null); for (final String key : o.isObject().keySet()) { final EJValue ejValue = o.isObject().get(key); if (key.startsWith(SerializationParts.EMBEDDED_JSON)) { final EJValue ejKey = ParserFactory.get().parse(key.substring(SerializationParts.EMBEDDED_JSON.length())); demarshalledKey = ctx.getMarshallerInstance(ctx.determineTypeFor(null, ejKey)).demarshall(ejKey, ctx); final String valueType = ctx.determineTypeFor(null, ejValue); impl.put(demarshalledKey, ctx.getMarshallerInstance(valueType).demarshall(ejValue, ctx)); } else { if (key.equals(SerializationParts.OBJECT_ID)) { continue; } if (assumedKeyType != null && assumedValueType != null) { if (key.equals(SerializationParts.NULL_VALUE)) { demarshalledKey = null; } else { demarshalledKey = convertKey(assumedKeyType, key, ctx); } final String valueType; if (ejValue.isObject() != null && ejValue.isObject().containsKey(SerializationParts.ENCODED_TYPE)) { valueType = ctx.determineTypeFor(null, ejValue); } else { valueType = assumedValueType; } final Object demarshalledValue = ctx.getMarshallerInstance(valueType).demarshall(ejValue, ctx); impl.put(demarshalledKey, demarshalledValue); } else { demarshalledKey = (key.equals(SerializationParts.NULL_VALUE)) ? null : key; impl.put( demarshalledKey, ctx.getMarshallerInstance(ctx.determineTypeFor(null, ejValue)) .demarshall(ejValue, ctx)); } } } return impl; }
@Override public Float doNotNullDemarshall(final EJValue o, final MarshallingSession ctx) { if (o.isObject() != null) { EJValue numVal = o.isObject().get(SerializationParts.NUMERIC_VALUE); if (numVal.isString() != null) { return Float.parseFloat(numVal.isString().stringValue()); } return numVal.isNumber().floatValue(); } else if (o.isString() != null) { return Float.parseFloat(o.isString().stringValue()); } else { return o.isNumber().floatValue(); } }
@Override public Date doNotNullDemarshall(final EJValue o, final MarshallingSession ctx) { if (o.isObject() != null) { EJValue qualifiedValue = o.isObject().get(SerializationParts.QUALIFIED_VALUE); if (!qualifiedValue.isNull() && qualifiedValue.isString() != null) { return new Date(Long.parseLong(qualifiedValue.isString().stringValue())); } EJValue numericValue = o.isObject().get(SerializationParts.NUMERIC_VALUE); if (!numericValue.isNull() && numericValue.isNumber() != null) { return new Date(new Double(numericValue.isNumber().doubleValue()).longValue()); } if (!numericValue.isNull() && numericValue.isString() != null) { return new Date(Long.parseLong(numericValue.isString().stringValue())); } } return null; }
public Enum demarshall(EJValue a0, MarshallingSession a1) { try { if (a0.isNull()) { return null; } return Enum.valueOf( enumType, a0.isObject().get(SerializationParts.ENUM_STRING_VALUE).isString().stringValue()); } catch (Throwable t) { t.printStackTrace(); throw new RuntimeException("error demarshalling enum: " + enumType.getName(), t); } }