Added type conversion support

This commit is contained in:
Rahul Kumar
2020-07-19 18:51:14 +05:30
parent 5541a6d91d
commit 250f74ef4d
3 changed files with 88 additions and 7 deletions

View File

@@ -26,10 +26,12 @@ SOFTWARE.
import java.io.Reader;
import java.io.StringReader;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Iterator;
/**
* This provides static methods to convert an XML text into a JSONObject, and to
* covert a JSONObject into an XML text.
@@ -72,6 +74,8 @@ public class XML {
*/
public static final String NULL_ATTR = "xsi:nil";
public static final String TYPE_ATTR = "xsi:type";
/**
* Creates an iterator for navigating Code Points in a string instead of
* characters. Once Java7 support is dropped, this can be replaced with
@@ -257,6 +261,7 @@ public class XML {
String string;
String tagName;
Object token;
String typeCastClass;
// Test for and skip past these forms:
// <!-- ... -->
@@ -336,6 +341,7 @@ public class XML {
token = null;
jsonObject = new JSONObject();
boolean nilAttributeFound = false;
typeCastClass = null;
for (;;) {
if (token == null) {
token = x.nextToken();
@@ -354,6 +360,9 @@ public class XML {
&& NULL_ATTR.equals(string)
&& Boolean.parseBoolean((String) token)) {
nilAttributeFound = true;
} else if(config.useValueTypeCast
&& TYPE_ATTR.equals(string)) {
typeCastClass = (String) token;
} else if (!nilAttributeFound) {
jsonObject.accumulate(string,
config.isKeepStrings()
@@ -392,8 +401,13 @@ public class XML {
} else if (token instanceof String) {
string = (String) token;
if (string.length() > 0) {
jsonObject.accumulate(config.getcDataTagName(),
config.isKeepStrings() ? string : stringToValue(string));
if(typeCastClass != null) {
jsonObject.accumulate(config.getcDataTagName(),
stringToValue(string, typeCastClass));
} else {
jsonObject.accumulate(config.getcDataTagName(),
config.isKeepStrings() ? string : stringToValue(string));
}
}
} else if (token == LT) {
@@ -418,6 +432,24 @@ public class XML {
}
}
/**
* This method tries to convert the given string value to the target object
* @param string String to convert
* @param className target class name
* @return JSON value of this string or the string
*/
public static Object stringToValue(String string, String className) {
try {
if(className.equals(String.class.getName())) return string;
Class<?> clazz = Class.forName(className);
Method method = clazz.getMethod("valueOf", String.class);
return method.invoke(null, string);
} catch (Exception e){
e.printStackTrace();
}
return stringToValue(string);
}
/**
* This method is the same as {@link JSONObject#stringToValue(String)}.
*