mirror of
https://github.com/ethauvin/JSON-java.git
synced 2025-06-17 07:50:52 -07:00
Implements unicode escaping similar to JSONObject.
* Removes deprecation on XML.stringToValue(). It now provides unescaping for strings to convert XML entities back into values. * New unescape function to handle XML entities -> value conversion.
This commit is contained in:
parent
c24be0e4ea
commit
a2d3b59394
2 changed files with 73 additions and 11 deletions
|
@ -175,7 +175,7 @@ public class JSONML {
|
||||||
if (!(token instanceof String)) {
|
if (!(token instanceof String)) {
|
||||||
throw x.syntaxError("Missing value");
|
throw x.syntaxError("Missing value");
|
||||||
}
|
}
|
||||||
newjo.accumulate(attribute, keepStrings ? token :JSONObject.stringToValue((String)token));
|
newjo.accumulate(attribute, keepStrings ? token :XML.stringToValue((String)token));
|
||||||
token = null;
|
token = null;
|
||||||
} else {
|
} else {
|
||||||
newjo.accumulate(attribute, "");
|
newjo.accumulate(attribute, "");
|
||||||
|
@ -226,7 +226,7 @@ public class JSONML {
|
||||||
} else {
|
} else {
|
||||||
if (ja != null) {
|
if (ja != null) {
|
||||||
ja.put(token instanceof String
|
ja.put(token instanceof String
|
||||||
? keepStrings ? token :JSONObject.stringToValue((String)token)
|
? keepStrings ? token :XML.stringToValue((String)token)
|
||||||
: token);
|
: token);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
80
XML.java
80
XML.java
|
@ -35,7 +35,6 @@ import java.util.Iterator;
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("boxing")
|
@SuppressWarnings("boxing")
|
||||||
public class XML {
|
public class XML {
|
||||||
|
|
||||||
/** The Character '&'. */
|
/** The Character '&'. */
|
||||||
public static final Character AMP = '&';
|
public static final Character AMP = '&';
|
||||||
|
|
||||||
|
@ -71,6 +70,7 @@ public class XML {
|
||||||
* < <small>(less than)</small> is replaced by &lt;
|
* < <small>(less than)</small> is replaced by &lt;
|
||||||
* > <small>(greater than)</small> is replaced by &gt;
|
* > <small>(greater than)</small> is replaced by &gt;
|
||||||
* " <small>(double quote)</small> is replaced by &quot;
|
* " <small>(double quote)</small> is replaced by &quot;
|
||||||
|
* ' <small>(single quote / apostrophe)</small> is replaced by &apos;
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* @param string
|
* @param string
|
||||||
|
@ -98,6 +98,67 @@ public class XML {
|
||||||
sb.append("'");
|
sb.append("'");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
if (c < ' ' || (c >= '\u0080' && c < '\u00a0') || (c >= '\u2000' && c < '\u2100')) {
|
||||||
|
sb.append("&#x");
|
||||||
|
sb.append(Integer.toHexString(c));
|
||||||
|
sb.append(";");
|
||||||
|
} else {
|
||||||
|
sb.append(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes XML escapes from the string.
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
* string to remove escapes from
|
||||||
|
* @return string with converted entities
|
||||||
|
*/
|
||||||
|
public static String unescape(String string) {
|
||||||
|
StringBuilder sb = new StringBuilder(string.length());
|
||||||
|
for (int i = 0, length = string.length(); i < length; i++) {
|
||||||
|
char c = string.charAt(i);
|
||||||
|
if (c == AMP) {
|
||||||
|
final int semic = string.indexOf(';', i);
|
||||||
|
if (semic > i) {
|
||||||
|
final String entity = string.substring(i + 1, semic);
|
||||||
|
if (entity.charAt(0) == '#') {
|
||||||
|
char cc;
|
||||||
|
if (entity.charAt(1) == 'x') {
|
||||||
|
// hex encoded unicode
|
||||||
|
cc = (char) Integer.parseInt(entity.substring(2), 16);
|
||||||
|
} else {
|
||||||
|
// decimal encoded unicode
|
||||||
|
cc = (char) Integer.parseInt(entity.substring(1));
|
||||||
|
}
|
||||||
|
sb.append(cc);
|
||||||
|
} else {
|
||||||
|
if ("quot".equalsIgnoreCase(entity)) {
|
||||||
|
sb.append('"');
|
||||||
|
} else if ("amp".equalsIgnoreCase(entity)) {
|
||||||
|
sb.append(AMP);
|
||||||
|
} else if ("apos".equalsIgnoreCase(entity)) {
|
||||||
|
sb.append('\'');
|
||||||
|
} else if ("lt".equalsIgnoreCase(entity)) {
|
||||||
|
sb.append('<');
|
||||||
|
} else if ("gt".equalsIgnoreCase(entity)) {
|
||||||
|
sb.append('>');
|
||||||
|
} else {
|
||||||
|
sb.append(AMP).append(entity).append(';');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// skip past the entity we just parsed.
|
||||||
|
i += entity.length() + 1;
|
||||||
|
} else {
|
||||||
|
// this shouldn't happen in most cases since the parser
|
||||||
|
// errors on unclosed enties.
|
||||||
|
sb.append(c);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// not part of an entity
|
||||||
sb.append(c);
|
sb.append(c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -227,7 +288,6 @@ public class XML {
|
||||||
if (token == null) {
|
if (token == null) {
|
||||||
token = x.nextToken();
|
token = x.nextToken();
|
||||||
}
|
}
|
||||||
|
|
||||||
// attribute = value
|
// attribute = value
|
||||||
if (token instanceof String) {
|
if (token instanceof String) {
|
||||||
string = (String) token;
|
string = (String) token;
|
||||||
|
@ -238,7 +298,7 @@ public class XML {
|
||||||
throw x.syntaxError("Missing value");
|
throw x.syntaxError("Missing value");
|
||||||
}
|
}
|
||||||
jsonobject.accumulate(string,
|
jsonobject.accumulate(string,
|
||||||
keepStrings ? token : JSONObject.stringToValue((String) token));
|
keepStrings ? unescape((String)token) : stringToValue((String) token));
|
||||||
token = null;
|
token = null;
|
||||||
} else {
|
} else {
|
||||||
jsonobject.accumulate(string, "");
|
jsonobject.accumulate(string, "");
|
||||||
|
@ -270,7 +330,7 @@ public class XML {
|
||||||
string = (String) token;
|
string = (String) token;
|
||||||
if (string.length() > 0) {
|
if (string.length() > 0) {
|
||||||
jsonobject.accumulate("content",
|
jsonobject.accumulate("content",
|
||||||
keepStrings ? token : JSONObject.stringToValue(string));
|
keepStrings ? unescape(string) : stringToValue(string));
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (token == LT) {
|
} else if (token == LT) {
|
||||||
|
@ -297,16 +357,18 @@ public class XML {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method has been deprecated in favor of the
|
* This method is the same as {@link JSONObject.stringToValue(String)}
|
||||||
* {@link JSONObject.stringToValue(String)} method. Use it instead.
|
* except that this also tries to unescape String values.
|
||||||
*
|
*
|
||||||
* @deprecated Use JSONObject#stringToValue(String) instead.
|
|
||||||
* @param string String to convert
|
* @param string String to convert
|
||||||
* @return JSON value of this string or the string
|
* @return JSON value of this string or the string
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
|
||||||
public static Object stringToValue(String string) {
|
public static Object stringToValue(String string) {
|
||||||
return JSONObject.stringToValue(string);
|
Object ret = JSONObject.stringToValue(string);
|
||||||
|
if(ret instanceof String){
|
||||||
|
return unescape((String)ret);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue