package cn.mutils.core.io.serial;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import java.lang.reflect.Type;
import cn.mutils.core.beans.BeanField;
import cn.mutils.core.json.IJsonItem;
import cn.mutils.core.json.JsonUtil;
import cn.mutils.core.properties.IPropertyItem;
import cn.mutils.core.reflect.ReflectUtil;
import cn.mutils.core.xml.IXmlItem;
import cn.mutils.core.xml.XmlUtil;
/**
* Support JSON string:{"k":"{"k":0}"}
*/
@SuppressWarnings({"serial", "unchecked", "unused"})
public class StringJson<T> extends Serial<T> {
public StringJson() {
super();
}
public StringJson(T value) {
super(value);
}
@Override
public String toString() {
try {
return JsonUtil.toString(mValue);
} catch (Exception e) {
return null;
}
}
protected T valueOf(String json, BeanField itemField) {
try {
Class<?> itemClass = itemField == null ? this.getClass() : itemField.getRawType();
Type genericType = itemField == null ? null : itemField.getGenericType();
Class<T> targetClass = (Class<T>) ReflectUtil.getParamRawType(itemClass, genericType, 0);
Type targetType = ReflectUtil.getParamGenericType(itemClass, genericType, 0);
return JsonUtil.fromString(json, targetClass, targetType);
} catch (Exception e) {
return null;
}
}
@Override
public IJsonItem fromJson(Object json, BeanField itemField) {
mValue = valueOf(json.toString(), itemField);
if (mValue == null) {
return null;
}
return this;
}
@Override
public Object toJson(BeanField itemField) {
return toString();
}
@Override
public IXmlItem fromXml(Node xml, BeanField itemField) {
mValue = valueOf(xml.getTextContent(), itemField);
if (mValue == null) {
return null;
}
return this;
}
@Override
public Node toXml(Document doc, BeanField itemField) {
String str = toString();
if (str == null) {
return doc.createElement(XmlUtil.TAG_NULL);
}
Node node = XmlUtil.newNode(doc, itemField);
node.setTextContent(str);
return node;
}
@Override
public IPropertyItem fromProperty(String value, BeanField itemField) {
mValue = valueOf(value, itemField);
return this;
}
@Override
public String toProperty(BeanField itemField) {
return toString();
}
}