mirror of
https://github.com/stleary/JSON-java.git
synced 2026-03-20 00:00:50 -04:00
Compare commits
57 Commits
6f92a3ab4e
...
20230227
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
47fb49b6a8 | ||
|
|
0df034c9fd | ||
|
|
f0a05e6911 | ||
|
|
1275f6809d | ||
|
|
9234eab00a | ||
|
|
72f4c3e646 | ||
|
|
df2d6f8363 | ||
|
|
a6e412bded | ||
|
|
2391d248cc | ||
|
|
401495ae86 | ||
|
|
448e204186 | ||
|
|
eb56704e68 | ||
|
|
651511f500 | ||
|
|
a14cb12c85 | ||
|
|
f566a1d9ee | ||
|
|
5920eca2d7 | ||
|
|
3b097d051a | ||
|
|
4e630e58a4 | ||
|
|
b732188e4e | ||
|
|
5369442671 | ||
|
|
bb1138762a | ||
|
|
6a732ec99d | ||
|
|
c798c76ddd | ||
|
|
23d5e52a53 | ||
|
|
98df35449a | ||
|
|
1be6ee31a7 | ||
|
|
a2d3d3c9b5 | ||
|
|
bf9219386a | ||
|
|
85495facbd | ||
|
|
7aba3ac941 | ||
|
|
d51250f6b0 | ||
|
|
9cb8e153bf | ||
|
|
80c1479ad8 | ||
|
|
444335d12a | ||
|
|
a2c0562e04 | ||
|
|
153972afdf | ||
|
|
4a8ff28fd8 | ||
|
|
fa457a4113 | ||
|
|
b7f708b222 | ||
|
|
12411b7981 | ||
|
|
61801c623e | ||
|
|
1915aab7c4 | ||
|
|
8439039da7 | ||
|
|
a6bdd081eb | ||
|
|
a30d71fdca | ||
|
|
cdd67b0aef | ||
|
|
89f6e7f6a6 | ||
|
|
346fb26f2d | ||
|
|
6daabb43ab | ||
|
|
57f785c42e | ||
|
|
3eecd67a3b | ||
|
|
5a587bbdfd | ||
|
|
e0534b3ec7 | ||
|
|
7dd9e01dae | ||
|
|
88ca19042b | ||
|
|
b4036e6a8e | ||
|
|
89f16ad0af |
2
.github/workflows/pipeline.yml
vendored
2
.github/workflows/pipeline.yml
vendored
@@ -42,7 +42,7 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
# build against supported Java LTS versions:
|
# build against supported Java LTS versions:
|
||||||
java: [ 1.7, 8, 11 ]
|
java: [ 8, 11 ]
|
||||||
name: Java ${{ matrix.java }}
|
name: Java ${{ matrix.java }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
|
|||||||
568
Examples.md
568
Examples.md
@@ -1,7 +1,7 @@
|
|||||||
<h1>Examples</h1>
|
<h1>Examples</h1>
|
||||||
<p>Imports used in the examples: </p>
|
<p>Imports used in the examples: </p>
|
||||||
|
|
||||||
```
|
```java
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
@@ -14,353 +14,353 @@ import java.util.Properties;
|
|||||||
|
|
||||||
<h3>Using JSONArray</h3>
|
<h3>Using JSONArray</h3>
|
||||||
|
|
||||||
```
|
```java
|
||||||
private static void JSONExampleArray1() {
|
private static void JSONExampleArray1() {
|
||||||
//We create a JSONObject from a String containing an array using JSONArray
|
//We create a JSONObject from a String containing an array using JSONArray
|
||||||
//Firstly, we declare an Array in a String
|
//Firstly, we declare an Array in a String
|
||||||
|
|
||||||
String arrayStr =
|
String arrayStr =
|
||||||
"["+"true,"+"false,"+ "\"true\","+ "\"false\","+"\"hello\","+"23.45e-4,"+
|
"["+"true,"+"false,"+ "\"true\","+ "\"false\","+"\"hello\","+"23.45e-4,"+
|
||||||
"\"23.45\","+"42,"+"\"43\","+"["+"\"world\""+"],"+
|
"\"23.45\","+"42,"+"\"43\","+"["+"\"world\""+"],"+
|
||||||
"{"+
|
"{"+
|
||||||
"\"key1\":\"value1\","+
|
"\"key1\":\"value1\","+
|
||||||
"\"key2\":\"value2\","+
|
"\"key2\":\"value2\","+
|
||||||
"\"key3\":\"value3\","+
|
"\"key3\":\"value3\","+
|
||||||
"\"key4\":\"value4\""+
|
"\"key4\":\"value4\""+
|
||||||
"},"+
|
"},"+
|
||||||
"0,"+"\"-1\""+
|
"0,"+"\"-1\""+
|
||||||
"]";
|
"]";
|
||||||
|
|
||||||
//Then, we initializate the JSONArray thanks to its constructor
|
//Then, we initializate the JSONArray thanks to its constructor
|
||||||
|
|
||||||
JSONArray array = new JSONArray(arrayStr);
|
JSONArray array = new JSONArray(arrayStr);
|
||||||
System.out.println("Values array: "+ array);
|
System.out.println("Values array: "+ array);
|
||||||
|
|
||||||
//We convert that array into a JSONObject, but first, we need the labels, so we need another JSONArray with the labels.
|
//We convert that array into a JSONObject, but first, we need the labels, so we need another JSONArray with the labels.
|
||||||
//Here we will use an auxiliary function to get one for the example.
|
//Here we will use an auxiliary function to get one for the example.
|
||||||
|
|
||||||
JSONArray list = listNumberArray(array.length());
|
JSONArray list = listNumberArray(array.length());
|
||||||
System.out.println("Label Array: "+ list.toString());
|
System.out.println("Label Array: "+ list.toString());
|
||||||
//Now, we construct the JSONObject using both the value array and the label array.
|
//Now, we construct the JSONObject using both the value array and the label array.
|
||||||
JSONObject object = array.toJSONObject(list);
|
JSONObject object = array.toJSONObject(list);
|
||||||
System.out.println("Final JSONOBject: " + object);
|
System.out.println("Final JSONOBject: " + object);
|
||||||
}
|
}
|
||||||
|
|
||||||
//This method creates an JSONArray of labels in which those are generated by their positions
|
//This method creates an JSONArray of labels in which those are generated by their positions
|
||||||
|
|
||||||
private static JSONArray listNumberArray(int max){
|
private static JSONArray listNumberArray(int max){
|
||||||
JSONArray res = new JSONArray();
|
JSONArray res = new JSONArray();
|
||||||
for (int i=0; i<max;i++) {
|
for (int i=0; i<max;i++) {
|
||||||
//The value of the labels must be an String in order to make it work
|
//The value of the labels must be an String in order to make it work
|
||||||
res.put(String.valueOf(i));
|
res.put(String.valueOf(i));
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
```
|
```
|
||||||
```
|
```java
|
||||||
private static void JSONExampleArray2() {
|
private static void JSONExampleArray2() {
|
||||||
|
|
||||||
//We can also create an Array without a String by creating an empty array and adding elements to it
|
//We can also create an Array without a String by creating an empty array and adding elements to it
|
||||||
|
|
||||||
JSONArray array = new JSONArray();
|
JSONArray array = new JSONArray();
|
||||||
|
|
||||||
//Adding elements with .put()
|
//Adding elements with .put()
|
||||||
|
|
||||||
array.put("value");
|
array.put("value");
|
||||||
array.put(5);
|
array.put(5);
|
||||||
array.put(-23.45e67);
|
array.put(-23.45e67);
|
||||||
array.put(true);
|
array.put(true);
|
||||||
|
|
||||||
//We convert it to JSONObject providing a label arrray like last time
|
//We convert it to JSONObject providing a label arrray like last time
|
||||||
|
|
||||||
JSONArray list = listNumberArray(array.length());
|
JSONArray list = listNumberArray(array.length());
|
||||||
JSONObject object = array.toJSONObject(list);
|
JSONObject object = array.toJSONObject(list);
|
||||||
System.out.println("Final JSONOBject: " + object);
|
System.out.println("Final JSONOBject: " + object);
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
<h3>Using JSONStringer</h3>
|
<h3>Using JSONStringer</h3>
|
||||||
|
|
||||||
```
|
```java
|
||||||
private static void JSONExampleStringer() {
|
private static void JSONExampleStringer() {
|
||||||
|
|
||||||
//We initializate the JSONStringer
|
//We initializate the JSONStringer
|
||||||
|
|
||||||
JSONStringer jsonStringer = new JSONStringer();
|
JSONStringer jsonStringer = new JSONStringer();
|
||||||
|
|
||||||
//Now we start the process of adding elements with .object()
|
//Now we start the process of adding elements with .object()
|
||||||
|
|
||||||
jsonStringer.object();
|
jsonStringer.object();
|
||||||
|
|
||||||
//We can now add elements as keys and values with .values () and .key()
|
//We can now add elements as keys and values with .values () and .key()
|
||||||
|
|
||||||
jsonStringer.key("trueValue").value(true);
|
jsonStringer.key("trueValue").value(true);
|
||||||
jsonStringer.key("falseValue").value(false);
|
jsonStringer.key("falseValue").value(false);
|
||||||
jsonStringer.key("nullValue").value(null);
|
jsonStringer.key("nullValue").value(null);
|
||||||
jsonStringer.key("stringValue").value("hello world!");
|
jsonStringer.key("stringValue").value("hello world!");
|
||||||
jsonStringer.key("complexStringValue").value("h\be\tllo w\u1234orld!");
|
jsonStringer.key("complexStringValue").value("h\be\tllo w\u1234orld!");
|
||||||
jsonStringer.key("intValue").value(42);
|
jsonStringer.key("intValue").value(42);
|
||||||
jsonStringer.key("doubleValue").value(-23.45e67);
|
jsonStringer.key("doubleValue").value(-23.45e67);
|
||||||
|
|
||||||
//We end this prcedure with .ednObject
|
//We end this prcedure with .ednObject
|
||||||
|
|
||||||
jsonStringer.endObject();
|
jsonStringer.endObject();
|
||||||
|
|
||||||
//Once we have a JSONStringer, we convert it to JSONObject generating a String and using JSONObject's contructor.
|
//Once we have a JSONStringer, we convert it to JSONObject generating a String and using JSONObject's contructor.
|
||||||
|
|
||||||
String str = jsonStringer.toString();
|
String str = jsonStringer.toString();
|
||||||
JSONObject jsonObject = new JSONObject(str);
|
JSONObject jsonObject = new JSONObject(str);
|
||||||
|
|
||||||
System.out.println("Final JSONOBject: " + jsonObject);
|
System.out.println("Final JSONOBject: " + jsonObject);
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
<h3>Using JSONObject</h3>
|
<h3>Using JSONObject</h3>
|
||||||
|
|
||||||
|
```java
|
||||||
|
private static void JSONExampleObject1() {
|
||||||
|
|
||||||
|
//We can create a JSONObject from a String with the class builder
|
||||||
|
|
||||||
|
String string = "{\"0\":\"value\",\"1\":5,\"2\":-2.345E68,\"3\":true}";
|
||||||
|
JSONObject example = new JSONObject(string);
|
||||||
|
System.out.println("Final JSONObject: " + example);
|
||||||
|
|
||||||
|
}
|
||||||
```
|
```
|
||||||
private static void JSONExampleObject1() {
|
```java
|
||||||
|
private static void JSONExampleObject2() {
|
||||||
|
|
||||||
//We can create a JSONObject from a String with the class builder
|
//We can also create a JSONObject directly without messing around with any of the other functions.
|
||||||
|
|
||||||
String string = "{\"0\":\"value\",\"1\":5,\"2\":-2.345E68,\"3\":true}";
|
JSONObject example = new JSONObject();
|
||||||
JSONObject example = new JSONObject(string);
|
|
||||||
System.out.println("Final JSONObject: " + example);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
//Now we add the keys and values in a similar way as the Stringer method
|
||||||
|
example.put("key", "value");
|
||||||
|
|
||||||
|
//As you can see, the first entry is the key and the second would be its associeted value.
|
||||||
|
|
||||||
|
example.put("key2", 5);
|
||||||
|
example.put("key3", -23.45e67);
|
||||||
|
example.put("trueValue", true);
|
||||||
|
|
||||||
|
//We can't add null values thougth
|
||||||
|
|
||||||
|
//example.put("nullValue", null); //This is not possible
|
||||||
|
|
||||||
|
System.out.println("Final JSONOBject: " + example);
|
||||||
|
}
|
||||||
```
|
```
|
||||||
```
|
```java
|
||||||
private static void JSONExampleObject2() {
|
private static void JSONExampleObject3() {
|
||||||
|
|
||||||
//We can also create a JSONObject directly without messing around with any of the other functions.
|
//We can also create a JSONObject with a Java Map
|
||||||
|
//YoU will need a Map whose keys are Strings. The values can be whatever you want
|
||||||
|
|
||||||
JSONObject example = new JSONObject();
|
Map<String,Double> map = new HashMap<String, Double>();
|
||||||
|
|
||||||
|
map.put("key1", 1.0);
|
||||||
|
map.put("key2", -23.45e67);
|
||||||
|
|
||||||
//Now we add the keys and values in a similar way as the Stringer method
|
//We create the JSONObject with the map with its class builder
|
||||||
example.put("key", "value");
|
|
||||||
|
|
||||||
//As you can see, the first entry is the key and the second would be its associeted value.
|
JSONObject example = new JSONObject(map);
|
||||||
|
System.out.println("Final JSONOBject: " + example);
|
||||||
example.put("key2", 5);
|
}
|
||||||
example.put("key3", -23.45e67);
|
|
||||||
example.put("trueValue", true);
|
|
||||||
|
|
||||||
//We can't add null values thougth
|
|
||||||
|
|
||||||
//example.put("nullValue", null); //This is not possible
|
|
||||||
|
|
||||||
System.out.println("Final JSONOBject: " + example);
|
|
||||||
}
|
|
||||||
```
|
|
||||||
```
|
|
||||||
private static void JSONExampleObject3() {
|
|
||||||
|
|
||||||
//We can also create a JSONObject with a Java Map
|
|
||||||
//YoU will need a Map whose keys are Strings. The values can be whatever you want
|
|
||||||
|
|
||||||
Map<String,Double> map = new HashMap<String, Double>();
|
|
||||||
|
|
||||||
map.put("key1", 1.0);
|
|
||||||
map.put("key2", -23.45e67);
|
|
||||||
|
|
||||||
//We create the JSONObject with the map with its class builder
|
|
||||||
|
|
||||||
JSONObject example = new JSONObject(map);
|
|
||||||
System.out.println("Final JSONOBject: " + example);
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
<h3>Using JSONWriter</h3>
|
<h3>Using JSONWriter</h3>
|
||||||
|
|
||||||
|
```java
|
||||||
|
private static void JSONExamplWriter() {
|
||||||
|
|
||||||
|
//This method works in a very similar way to Object and Stringer in the construction of the JSON.
|
||||||
|
//The difference is that it needs a Java object called "Appendable" like StringBuilder
|
||||||
|
|
||||||
|
StringBuilder write = new StringBuilder();
|
||||||
|
JSONWriter jsonWriter = new JSONWriter(write);
|
||||||
|
|
||||||
|
//We behave now the same way as Stringer
|
||||||
|
|
||||||
|
jsonWriter.object();
|
||||||
|
|
||||||
|
jsonWriter.key("trueValue").value(true);
|
||||||
|
jsonWriter.key("falseValue").value(false);
|
||||||
|
jsonWriter.key("nullValue").value(null);
|
||||||
|
jsonWriter.key("stringValue").value("hello world!");
|
||||||
|
jsonWriter.key("complexStringValue").value("h\be\tllo w\u1234orld!");
|
||||||
|
jsonWriter.key("intValue").value(42);
|
||||||
|
jsonWriter.key("doubleValue").value(-23.45e67);
|
||||||
|
|
||||||
|
jsonWriter.endObject();
|
||||||
|
|
||||||
|
//The resoult should be in the "write" object
|
||||||
|
|
||||||
|
System.out.println("JSON: " + write.toString());
|
||||||
|
|
||||||
|
//The difference is that we don't get a JSONObject in this one.
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
```
|
```
|
||||||
private static void JSONExamplWriter() {
|
```java
|
||||||
|
private static void JSONExampleTokener() {
|
||||||
|
|
||||||
//This method works in a very similar way to Object and Stringer in the construction of the JSON.
|
//A partir de una String podemos crear un JSONTokener, que lo podemos usar alternativamente para JSONArray,JSONObject
|
||||||
//The difference is that it needs a Java object called "Appendable" like StringBuilder
|
|
||||||
|
|
||||||
StringBuilder write = new StringBuilder();
|
String string = "this is not a valid JSON string";
|
||||||
JSONWriter jsonWriter = new JSONWriter(write);
|
JSONTokener token = new JSONTokener(string);
|
||||||
|
|
||||||
//We behave now the same way as Stringer
|
//Now you can use the token in JSONObject and Array the same way as a String
|
||||||
|
|
||||||
jsonWriter.object();
|
JSONObject object = new JSONObject(token);
|
||||||
|
JSONArray array = new JSONArray(token);
|
||||||
|
|
||||||
jsonWriter.key("trueValue").value(true);
|
}
|
||||||
jsonWriter.key("falseValue").value(false);
|
|
||||||
jsonWriter.key("nullValue").value(null);
|
|
||||||
jsonWriter.key("stringValue").value("hello world!");
|
|
||||||
jsonWriter.key("complexStringValue").value("h\be\tllo w\u1234orld!");
|
|
||||||
jsonWriter.key("intValue").value(42);
|
|
||||||
jsonWriter.key("doubleValue").value(-23.45e67);
|
|
||||||
|
|
||||||
jsonWriter.endObject();
|
|
||||||
|
|
||||||
//The resoult should be in the "write" object
|
|
||||||
|
|
||||||
System.out.println("JSON: " + write.toString());
|
|
||||||
|
|
||||||
//The difference is that we don't get a JSONObject in this one.
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
```
|
|
||||||
```
|
|
||||||
private static void JSONExampleTokener() {
|
|
||||||
|
|
||||||
//A partir de una String podemos crear un JSONTokener, que lo podemos usar alternativamente para JSONArray,JSONObject
|
|
||||||
|
|
||||||
String string = "this is not a valid JSON string";
|
|
||||||
JSONTokener token = new JSONTokener(string);
|
|
||||||
|
|
||||||
//Now you can use the token in JSONObject and Array the same way as a String
|
|
||||||
|
|
||||||
JSONObject object = new JSONObject(token);
|
|
||||||
JSONArray array = new JSONArray(token);
|
|
||||||
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
<h2>Part 2: Conversion methods</h2>
|
<h2>Part 2: Conversion methods</h2>
|
||||||
<p>We don't need to have a JSON docuemnt to work. This project also admits conversions from other type of files.</p>
|
<p>We don't need to have a JSON document to work. This project also admits conversions from other type of files.</p>
|
||||||
<p>Secondly, we can also convert from JSON to those type of files.</p>
|
<p>Secondly, we can also convert from JSON to those type of files.</p>
|
||||||
|
|
||||||
<h3>Extra: Conversion to JSONArray</h3>
|
<h3>Extra: Conversion to JSONArray</h3>
|
||||||
|
|
||||||
```
|
```java
|
||||||
private static void JSONObjectToArray() {
|
private static void JSONObjectToArray() {
|
||||||
//We start with a JSONObject
|
//We start with a JSONObject
|
||||||
|
|
||||||
String string = "{\"0\":\"value\",\"1\":5,\"2\":-2.345E68,\"3\":true}";
|
String string = "{\"0\":\"value\",\"1\":5,\"2\":-2.345E68,\"3\":true}";
|
||||||
|
|
||||||
JSONObject example = new JSONObject(string);
|
JSONObject example = new JSONObject(string);
|
||||||
|
|
||||||
//We need a list of key strings like the reverse operation
|
//We need a list of key strings like the reverse operation
|
||||||
|
|
||||||
JSONArray keyStrings = listNumberArray(example.length());
|
JSONArray keyStrings = listNumberArray(example.length());
|
||||||
|
|
||||||
//Then we convert to the Array using both elelements
|
//Then we convert to the Array using both elelements
|
||||||
|
|
||||||
JSONArray array = example.toJSONArray(keyStrings);
|
JSONArray array = example.toJSONArray(keyStrings);
|
||||||
|
|
||||||
System.out.println("Final JSONArray: " + array);
|
System.out.println("Final JSONArray: " + array);
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
<h3>XML Conversions</h3>
|
<h3>XML Conversions</h3>
|
||||||
|
|
||||||
|
```java
|
||||||
|
private static void XMLToExampleConversion() {
|
||||||
|
|
||||||
|
//We start with a JSONObject
|
||||||
|
|
||||||
|
String string = "{\"0\":\"value\",\"1\":5,\"2\":-2.345E68,\"3\":true}";
|
||||||
|
JSONObject example = new JSONObject(string);
|
||||||
|
|
||||||
|
//We obtain a String with XML format with toString()
|
||||||
|
|
||||||
|
String output = XML.toString(example);
|
||||||
|
System.out.println("Final XML: " + output);
|
||||||
|
}
|
||||||
```
|
```
|
||||||
private static void XMLToExampleConversion() {
|
```java
|
||||||
|
private static void XMLFromExampleConversion() {
|
||||||
|
|
||||||
//We start with a JSONObject
|
//We start with a string with the XML format
|
||||||
|
|
||||||
String string = "{\"0\":\"value\",\"1\":5,\"2\":-2.345E68,\"3\":true}";
|
String string = "<0>value</0><1>5</1><2>-2.345E+68</2><3>true</3>";
|
||||||
JSONObject example = new JSONObject(string);
|
|
||||||
|
|
||||||
//We obtain a String with XML format with toString()
|
//We obtain a JSONObject with toJSONOBject()
|
||||||
|
|
||||||
String output = XML.toString(example);
|
JSONObject output = XML.toJSONObject(string);
|
||||||
System.out.println("Final XML: " + output);
|
|
||||||
}
|
|
||||||
```
|
|
||||||
```
|
|
||||||
private static void XMLFromExampleConversion() {
|
|
||||||
|
|
||||||
//We start with a string with the XML format
|
System.out.println("Final JSONObject: " + output);
|
||||||
|
}
|
||||||
String string = "<0>value</0><1>5</1><2>-2.345E+68</2><3>true</3>";
|
|
||||||
|
|
||||||
//We obtain a JSONObject with toJSONOBject()
|
|
||||||
|
|
||||||
JSONObject output = XML.toJSONObject(string);
|
|
||||||
|
|
||||||
System.out.println("Final JSONObject: " + output);
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
<h3>Cookie Conversions</h3>
|
<h3>Cookie Conversions</h3>
|
||||||
|
|
||||||
|
```java
|
||||||
|
private static void CookieToExampleConversion() {
|
||||||
|
|
||||||
|
//We start with a JSONObject
|
||||||
|
//The JSONOBject needs to entries that gives the cookie a name and gives the field "name" a name too.
|
||||||
|
//The Cokkie format doesn't support booleans
|
||||||
|
|
||||||
|
String string = "{\"name\":\"Cookie-Name\",\"value\":\"name\",\"1\":5,\"2\":-2.345E68,\"3\":'true'}";
|
||||||
|
JSONObject example = new JSONObject(string);
|
||||||
|
|
||||||
|
//We obtain a String with Cookie format with toString()
|
||||||
|
|
||||||
|
String output = Cookie.toString(example);
|
||||||
|
System.out.println("Final Cookie: " + output);
|
||||||
|
}
|
||||||
```
|
```
|
||||||
private static void CookieToExampleConversion() {
|
```java
|
||||||
|
private static void CookieFromExampleConversion() {
|
||||||
|
|
||||||
//We start with a JSONObject
|
//We start with a string with the Cookie format
|
||||||
//The JSONOBject needs to entries that gives the cookie a name and gives the field "name" a name too.
|
|
||||||
//The Cokkie format doesn't support booleans
|
|
||||||
|
|
||||||
String string = "{\"name\":\"Cookie-Name\",\"value\":\"name\",\"1\":5,\"2\":-2.345E68,\"3\":'true'}";
|
String string = "Cookie-Name=name;1=5;2=-2.345E%2b68;3=true";
|
||||||
JSONObject example = new JSONObject(string);
|
|
||||||
|
|
||||||
//We obtain a String with Cookie format with toString()
|
//We obtain a JSONObject with toJSONOBject()
|
||||||
|
|
||||||
String output = Cookie.toString(example);
|
JSONObject output = Cookie.toJSONObject(string);
|
||||||
System.out.println("Final Cookie: " + output);
|
System.out.println("Final JSONObject: " + output);
|
||||||
}
|
}
|
||||||
```
|
|
||||||
```
|
|
||||||
private static void CookieFromExampleConversion() {
|
|
||||||
|
|
||||||
//We start with a string with the Cookie format
|
|
||||||
|
|
||||||
String string = "Cookie-Name=name;1=5;2=-2.345E%2b68;3=true";
|
|
||||||
|
|
||||||
//We obtain a JSONObject with toJSONOBject()
|
|
||||||
|
|
||||||
JSONObject output = Cookie.toJSONObject(string);
|
|
||||||
System.out.println("Final JSONObject: " + output);
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
<h3>HTTP Conversions</h3>
|
<h3>HTTP Conversions</h3>
|
||||||
|
|
||||||
|
```java
|
||||||
|
private static void HTTPToExampleConversion() {
|
||||||
|
|
||||||
|
//We start with a JSONObject
|
||||||
|
//The JSONObject must have the minimun header for a HTTP request or header
|
||||||
|
|
||||||
|
String string = "{\"Method\":\"POST\",\"Request-URI\":'/',\"HTTP-Version\":'HTTP/1.1',\"Value1\":true,\"Value2\":2,\"Value3\":-2.345E68}";
|
||||||
|
|
||||||
|
JSONObject example = new JSONObject(string);
|
||||||
|
|
||||||
|
//We obtain a String with HTTP format with toString()
|
||||||
|
|
||||||
|
String output = HTTP.toString(example);
|
||||||
|
System.out.println("Final HTTP: " + output);
|
||||||
|
}
|
||||||
```
|
```
|
||||||
private static void HTTPToExampleConversion() {
|
```java
|
||||||
|
private static void HTTPFromExampleConversion() {
|
||||||
|
|
||||||
//We start with a JSONObject
|
//We start with a string with the HTTP format
|
||||||
//The JSONObject must have the minimun header for a HTTP request or header
|
|
||||||
|
|
||||||
String string = "{\"Method\":\"POST\",\"Request-URI\":'/',\"HTTP-Version\":'HTTP/1.1',\"Value1\":true,\"Value2\":2,\"Value3\":-2.345E68}";
|
String string = "Final HTTP: POST '/' HTTP/1.1 Value3: -2.345E+68 Value1: true Value2: 2";
|
||||||
|
|
||||||
JSONObject example = new JSONObject(string);
|
//We obtain a JSONObject with toJSONOBject()
|
||||||
|
|
||||||
//We obtain a String with HTTP format with toString()
|
JSONObject output = HTTP.toJSONObject(string);
|
||||||
|
System.out.println("Final JSONObject: " + output);
|
||||||
String output = HTTP.toString(example);
|
}
|
||||||
System.out.println("Final HTTP: " + output);
|
|
||||||
}
|
|
||||||
```
|
|
||||||
```
|
|
||||||
private static void HTTPFromExampleConversion() {
|
|
||||||
|
|
||||||
//We start with a string with the HTTP format
|
|
||||||
|
|
||||||
String string = "Final HTTP: POST '/' HTTP/1.1 Value3: -2.345E+68 Value1: true Value2: 2";
|
|
||||||
|
|
||||||
//We obtain a JSONObject with toJSONOBject()
|
|
||||||
|
|
||||||
JSONObject output = HTTP.toJSONObject(string);
|
|
||||||
System.out.println("Final JSONObject: " + output);
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
<h3>CDL Conversions</h3>
|
<h3>CDL Conversions</h3>
|
||||||
|
|
||||||
```
|
```java
|
||||||
private static void CDLToExampleConversion() {
|
private static void CDLToExampleConversion() {
|
||||||
|
|
||||||
//We start with some JSONObjects with the same values in the keys but different values in the "values"
|
//We start with some JSONObjects with the same values in the keys but different values in the "values"
|
||||||
|
|
||||||
String string = "{\"0\":\"value\",\"1\":5,\"2\":-2.345E68,\"3\":true}";
|
String string = "{\"0\":\"value\",\"1\":5,\"2\":-2.345E68,\"3\":true}";
|
||||||
JSONObject example = new JSONObject(string);
|
JSONObject example = new JSONObject(string);
|
||||||
|
|
||||||
String string2 = "{\"0\":\"value2\",\"1\":6,\"2\":-8.345E68,\"3\":false}";
|
String string2 = "{\"0\":\"value2\",\"1\":6,\"2\":-8.345E68,\"3\":false}";
|
||||||
JSONObject example2 = new JSONObject(string2);
|
JSONObject example2 = new JSONObject(string2);
|
||||||
|
|
||||||
//We need now a JSONArray with those JSONObjects
|
//We need now a JSONArray with those JSONObjects
|
||||||
|
|
||||||
JSONArray array = new JSONArray();
|
JSONArray array = new JSONArray();
|
||||||
array.put(example);
|
array.put(example);
|
||||||
array.put(example2);
|
array.put(example2);
|
||||||
|
|
||||||
//We obtain a String with XML format with toString()
|
//We obtain a String with XML format with toString()
|
||||||
|
|
||||||
String output = CDL.toString(array);
|
String output = CDL.toString(array);
|
||||||
System.out.println("Final CDL: \r\n" + output);
|
System.out.println("Final CDL: \r\n" + output);
|
||||||
}
|
}
|
||||||
```
|
|
||||||
```
|
```
|
||||||
|
```java
|
||||||
private static void CDLFromExampleConversion() {
|
private static void CDLFromExampleConversion() {
|
||||||
|
|
||||||
//We start wtih a String with the CDL format
|
//We start wtih a String with the CDL format
|
||||||
@@ -377,8 +377,8 @@ private static void CDLFromExampleConversion() {
|
|||||||
```
|
```
|
||||||
<h3>Properties Conversions</h3>
|
<h3>Properties Conversions</h3>
|
||||||
|
|
||||||
```
|
```java
|
||||||
private static Properties PropertyToExampleConversion() {
|
private static Properties PropertyToExampleConversion() {
|
||||||
|
|
||||||
//We start with a JSONObject
|
//We start with a JSONObject
|
||||||
|
|
||||||
@@ -391,43 +391,43 @@ private static void CDLFromExampleConversion() {
|
|||||||
System.out.println("Final Properties: " + output);
|
System.out.println("Final Properties: " + output);
|
||||||
|
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
```java
|
||||||
|
private static void PropertyFromExampleConversion() {
|
||||||
|
|
||||||
|
//We start with a Properties object
|
||||||
|
|
||||||
|
Properties input = PropertyToExampleConversion();
|
||||||
|
|
||||||
|
//We obtain a JSONObject with toJSONOBject()
|
||||||
|
|
||||||
|
JSONObject output = Property.toJSONObject(input);
|
||||||
|
System.out.println("Final JSONObject: " + output);
|
||||||
|
}
|
||||||
```
|
```
|
||||||
private static void PropertyFromExampleConversion() {
|
<h2>List of all examples methods</h2>
|
||||||
|
|
||||||
//We start with a Properties object
|
```java
|
||||||
|
public static void main(String[] args) {
|
||||||
Properties input = PropertyToExampleConversion();
|
//JSONObjectToArray();
|
||||||
|
//JSONExampleArray1();
|
||||||
//We obtain a JSONObject with toJSONOBject()
|
//JSONExampleArray2();
|
||||||
|
//JSONExampleStringer();
|
||||||
JSONObject output = Property.toJSONObject(input);
|
//JSONExampleObject1();
|
||||||
System.out.println("Final JSONObject: " + output);
|
//JSONExampleObject2();
|
||||||
}
|
//JSONExampleObject3();
|
||||||
```
|
//JSONExamplWriter();
|
||||||
<h2>List of all examples methods</h2>
|
//XMLToExampleConversion();
|
||||||
|
//XMLFromExampleConversion();
|
||||||
```
|
//CookieToExampleConversion();
|
||||||
public static void main(String[] args) {
|
//CookieFromExampleConversion();
|
||||||
//JSONObjectToArray();
|
//HTTPToExampleConversion();
|
||||||
//JSONExampleArray1();
|
//HTTPFromExampleConversion();
|
||||||
//JSONExampleArray2();
|
//CDLToExampleConversion();
|
||||||
//JSONExampleStringer();
|
//CDLFromExampleConversion();
|
||||||
//JSONExampleObject1();
|
//PropertyToExampleConversion();
|
||||||
//JSONExampleObject2();
|
//PropertyFromExampleConversion();
|
||||||
//JSONExampleObject3();
|
}
|
||||||
//JSONExamplWriter();
|
|
||||||
//XMLToExampleConversion();
|
|
||||||
//XMLFromExampleConversion();
|
|
||||||
//CookieToExampleConversion();
|
|
||||||
//CookieFromExampleConversion();
|
|
||||||
//HTTPToExampleConversion();
|
|
||||||
//HTTPFromExampleConversion();
|
|
||||||
//CDLToExampleConversion();
|
|
||||||
//CDLFromExampleConversion();
|
|
||||||
//PropertyToExampleConversion();
|
|
||||||
//PropertyFromExampleConversion();
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
23
LICENSE
23
LICENSE
@@ -1,23 +1,2 @@
|
|||||||
|
Public Domain.
|
||||||
Copyright (c) 2002 JSON.org
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ JSON in Java [package org.json]
|
|||||||
|
|
||||||
[](https://mvnrepository.com/artifact/org.json/json)
|
[](https://mvnrepository.com/artifact/org.json/json)
|
||||||
|
|
||||||
**[Click here if you just want the latest release jar file.](https://search.maven.org/remotecontent?filepath=org/json/json/20220320/json-20220320.jar)**
|
**[Click here if you just want the latest release jar file.](https://search.maven.org/remotecontent?filepath=org/json/json/20230227/json-20230227.jar)**
|
||||||
|
|
||||||
|
|
||||||
# Overview
|
# Overview
|
||||||
@@ -28,8 +28,6 @@ Project goals include:
|
|||||||
|
|
||||||
The files in this package implement JSON encoders and decoders. The package can also convert between JSON and XML, HTTP headers, Cookies, and CDL.
|
The files in this package implement JSON encoders and decoders. The package can also convert between JSON and XML, HTTP headers, Cookies, and CDL.
|
||||||
|
|
||||||
The license includes this restriction: ["The software shall be used for good, not evil."](https://en.wikipedia.org/wiki/Douglas_Crockford#%22Good,_not_Evil%22) If your conscience cannot live with that, then choose a different package.
|
|
||||||
|
|
||||||
# If you would like to contribute to this project
|
# If you would like to contribute to this project
|
||||||
|
|
||||||
For more information on contributions, please see [CONTRIBUTING.md](https://github.com/stleary/JSON-java/blob/master/docs/CONTRIBUTING.md)
|
For more information on contributions, please see [CONTRIBUTING.md](https://github.com/stleary/JSON-java/blob/master/docs/CONTRIBUTING.md)
|
||||||
|
|||||||
@@ -5,6 +5,10 @@ and artifactId "json". For example:
|
|||||||
[https://search.maven.org/search?q=g:org.json%20AND%20a:json&core=gav](https://search.maven.org/search?q=g:org.json%20AND%20a:json&core=gav)
|
[https://search.maven.org/search?q=g:org.json%20AND%20a:json&core=gav](https://search.maven.org/search?q=g:org.json%20AND%20a:json&core=gav)
|
||||||
|
|
||||||
~~~
|
~~~
|
||||||
|
20230227 Fix for CVE-2022-45688 and recent commits
|
||||||
|
|
||||||
|
20220924 New License - public domain, and some minor updates
|
||||||
|
|
||||||
20220320 Wrap StackOverflow with JSONException
|
20220320 Wrap StackOverflow with JSONException
|
||||||
|
|
||||||
20211205 Recent commits and some bug fixes for similar()
|
20211205 Recent commits and some bug fixes for similar()
|
||||||
@@ -18,6 +22,7 @@ and artifactId "json". For example:
|
|||||||
20190722 Recent commits
|
20190722 Recent commits
|
||||||
|
|
||||||
20180813 POM change to include Automatic-Module-Name (#431)
|
20180813 POM change to include Automatic-Module-Name (#431)
|
||||||
|
JSONObject(Map) now throws an exception if any of a map keys are null (#405)
|
||||||
|
|
||||||
20180130 Recent commits
|
20180130 Recent commits
|
||||||
|
|
||||||
|
|||||||
29
pom.xml
29
pom.xml
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
<groupId>org.json</groupId>
|
<groupId>org.json</groupId>
|
||||||
<artifactId>json</artifactId>
|
<artifactId>json</artifactId>
|
||||||
<version>20220320</version>
|
<version>20230227</version>
|
||||||
<packaging>bundle</packaging>
|
<packaging>bundle</packaging>
|
||||||
|
|
||||||
<name>JSON in Java</name>
|
<name>JSON in Java</name>
|
||||||
@@ -18,10 +18,6 @@
|
|||||||
This is a reference implementation. There is a large number of JSON packages
|
This is a reference implementation. There is a large number of JSON packages
|
||||||
in Java. Perhaps someday the Java community will standardize on one. Until
|
in Java. Perhaps someday the Java community will standardize on one. Until
|
||||||
then, choose carefully.
|
then, choose carefully.
|
||||||
|
|
||||||
The license includes this restriction: "The software shall be used for good,
|
|
||||||
not evil." If your conscience cannot live with that, then choose a different
|
|
||||||
package.
|
|
||||||
</description>
|
</description>
|
||||||
<url>https://github.com/douglascrockford/JSON-java</url>
|
<url>https://github.com/douglascrockford/JSON-java</url>
|
||||||
|
|
||||||
@@ -39,28 +35,9 @@
|
|||||||
|
|
||||||
<licenses>
|
<licenses>
|
||||||
<license>
|
<license>
|
||||||
<name>The JSON License</name>
|
<name>Public Domain</name>
|
||||||
<url>http://json.org/license.html</url>
|
<url>https://github.com/stleary/JSON-java/blob/master/LICENSE</url>
|
||||||
<distribution>repo</distribution>
|
<distribution>repo</distribution>
|
||||||
<comments>Copyright (c) 2002 JSON.org
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
|
|
||||||
associated documentation files (the "Software"), to deal in the Software without restriction, including
|
|
||||||
without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the
|
|
||||||
following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all copies or substantial
|
|
||||||
portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
|
|
||||||
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
|
||||||
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
||||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
</comments>
|
|
||||||
</license>
|
</license>
|
||||||
</licenses>
|
</licenses>
|
||||||
|
|
||||||
|
|||||||
@@ -1,27 +1,7 @@
|
|||||||
package org.json;
|
package org.json;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2002 JSON.org
|
Public Domain.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -3,27 +3,7 @@ package org.json;
|
|||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2002 JSON.org
|
Public Domain.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,27 +1,7 @@
|
|||||||
package org.json;
|
package org.json;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2002 JSON.org
|
Public Domain.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,27 +1,7 @@
|
|||||||
package org.json;
|
package org.json;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2002 JSON.org
|
Public Domain.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
|||||||
@@ -1,27 +1,7 @@
|
|||||||
package org.json;
|
package org.json;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2002 JSON.org
|
Public Domain.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,27 +1,7 @@
|
|||||||
package org.json;
|
package org.json;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2002 JSON.org
|
Public Domain.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@@ -1386,6 +1366,10 @@ public class JSONArray implements Iterable<Object> {
|
|||||||
if (!JSONObject.isNumberSimilar((Number)valueThis, (Number)valueOther)) {
|
if (!JSONObject.isNumberSimilar((Number)valueThis, (Number)valueOther)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
} else if (valueThis instanceof JSONString && valueOther instanceof JSONString) {
|
||||||
|
if (!((JSONString) valueThis).toJSONString().equals(((JSONString) valueOther).toJSONString())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
} else if (!valueThis.equals(valueOther)) {
|
} else if (!valueThis.equals(valueOther)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,27 +1,7 @@
|
|||||||
package org.json;
|
package org.json;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2002 JSON.org
|
Public Domain.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,27 +1,7 @@
|
|||||||
package org.json;
|
package org.json;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2008 JSON.org
|
Public Domain.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -47,7 +27,32 @@ public class JSONML {
|
|||||||
XMLTokener x,
|
XMLTokener x,
|
||||||
boolean arrayForm,
|
boolean arrayForm,
|
||||||
JSONArray ja,
|
JSONArray ja,
|
||||||
boolean keepStrings
|
boolean keepStrings,
|
||||||
|
int currentNestingDepth
|
||||||
|
) throws JSONException {
|
||||||
|
return parse(x,arrayForm, ja,
|
||||||
|
keepStrings ? JSONMLParserConfiguration.KEEP_STRINGS : JSONMLParserConfiguration.ORIGINAL,
|
||||||
|
currentNestingDepth);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse XML values and store them in a JSONArray.
|
||||||
|
* @param x The XMLTokener containing the source string.
|
||||||
|
* @param arrayForm true if array form, false if object form.
|
||||||
|
* @param ja The JSONArray that is containing the current tag or null
|
||||||
|
* if we are at the outermost level.
|
||||||
|
* @param config The parser configuration:
|
||||||
|
* JSONMLParserConfiguration.ORIGINAL is the default behaviour;
|
||||||
|
* JSONMLParserConfiguration.KEEP_STRINGS means Don't type-convert text nodes and attribute values.
|
||||||
|
* @return A JSONArray if the value is the outermost tag, otherwise null.
|
||||||
|
* @throws JSONException if a parsing error occurs
|
||||||
|
*/
|
||||||
|
private static Object parse(
|
||||||
|
XMLTokener x,
|
||||||
|
boolean arrayForm,
|
||||||
|
JSONArray ja,
|
||||||
|
JSONMLParserConfiguration config,
|
||||||
|
int currentNestingDepth
|
||||||
) throws JSONException {
|
) throws JSONException {
|
||||||
String attribute;
|
String attribute;
|
||||||
char c;
|
char c;
|
||||||
@@ -172,7 +177,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 ? ((String)token) :XML.stringToValue((String)token));
|
newjo.accumulate(attribute, config.isKeepStrings() ? ((String)token) :XML.stringToValue((String)token));
|
||||||
token = null;
|
token = null;
|
||||||
} else {
|
} else {
|
||||||
newjo.accumulate(attribute, "");
|
newjo.accumulate(attribute, "");
|
||||||
@@ -201,7 +206,12 @@ public class JSONML {
|
|||||||
if (token != XML.GT) {
|
if (token != XML.GT) {
|
||||||
throw x.syntaxError("Misshaped tag");
|
throw x.syntaxError("Misshaped tag");
|
||||||
}
|
}
|
||||||
closeTag = (String)parse(x, arrayForm, newja, keepStrings);
|
|
||||||
|
if (currentNestingDepth == config.getMaxNestingDepth()) {
|
||||||
|
throw x.syntaxError("Maximum nesting depth of " + config.getMaxNestingDepth() + " reached");
|
||||||
|
}
|
||||||
|
|
||||||
|
closeTag = (String)parse(x, arrayForm, newja, config, currentNestingDepth + 1);
|
||||||
if (closeTag != null) {
|
if (closeTag != null) {
|
||||||
if (!closeTag.equals(tagName)) {
|
if (!closeTag.equals(tagName)) {
|
||||||
throw x.syntaxError("Mismatched '" + tagName +
|
throw x.syntaxError("Mismatched '" + tagName +
|
||||||
@@ -223,7 +233,7 @@ public class JSONML {
|
|||||||
} else {
|
} else {
|
||||||
if (ja != null) {
|
if (ja != null) {
|
||||||
ja.put(token instanceof String
|
ja.put(token instanceof String
|
||||||
? keepStrings ? XML.unescape((String)token) :XML.stringToValue((String)token)
|
? (config.isKeepStrings() ? XML.unescape((String)token) : XML.stringToValue((String)token))
|
||||||
: token);
|
: token);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -244,7 +254,7 @@ public class JSONML {
|
|||||||
* @throws JSONException Thrown on error converting to a JSONArray
|
* @throws JSONException Thrown on error converting to a JSONArray
|
||||||
*/
|
*/
|
||||||
public static JSONArray toJSONArray(String string) throws JSONException {
|
public static JSONArray toJSONArray(String string) throws JSONException {
|
||||||
return (JSONArray)parse(new XMLTokener(string), true, null, false);
|
return (JSONArray)parse(new XMLTokener(string), true, null, JSONMLParserConfiguration.ORIGINAL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -266,7 +276,56 @@ public class JSONML {
|
|||||||
* @throws JSONException Thrown on error converting to a JSONArray
|
* @throws JSONException Thrown on error converting to a JSONArray
|
||||||
*/
|
*/
|
||||||
public static JSONArray toJSONArray(String string, boolean keepStrings) throws JSONException {
|
public static JSONArray toJSONArray(String string, boolean keepStrings) throws JSONException {
|
||||||
return (JSONArray)parse(new XMLTokener(string), true, null, keepStrings);
|
return (JSONArray)parse(new XMLTokener(string), true, null, keepStrings, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a well-formed (but not necessarily valid) XML string into a
|
||||||
|
* JSONArray using the JsonML transform. Each XML tag is represented as
|
||||||
|
* a JSONArray in which the first element is the tag name. If the tag has
|
||||||
|
* attributes, then the second element will be JSONObject containing the
|
||||||
|
* name/value pairs. If the tag contains children, then strings and
|
||||||
|
* JSONArrays will represent the child tags.
|
||||||
|
* As opposed to toJSONArray this method does not attempt to convert
|
||||||
|
* any text node or attribute value to any type
|
||||||
|
* but just leaves it as a string.
|
||||||
|
* Comments, prologs, DTDs, and <pre>{@code <[ [ ]]>}</pre> are ignored.
|
||||||
|
* @param string The source string.
|
||||||
|
* @param config The parser configuration:
|
||||||
|
* JSONMLParserConfiguration.ORIGINAL is the default behaviour;
|
||||||
|
* JSONMLParserConfiguration.KEEP_STRINGS means values will not be coerced into boolean
|
||||||
|
* or numeric values and will instead be left as strings
|
||||||
|
* @return A JSONArray containing the structured data from the XML string.
|
||||||
|
* @throws JSONException Thrown on error converting to a JSONArray
|
||||||
|
*/
|
||||||
|
public static JSONArray toJSONArray(String string, JSONMLParserConfiguration config) throws JSONException {
|
||||||
|
return (JSONArray)parse(new XMLTokener(string), true, null, config, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a well-formed (but not necessarily valid) XML string into a
|
||||||
|
* JSONArray using the JsonML transform. Each XML tag is represented as
|
||||||
|
* a JSONArray in which the first element is the tag name. If the tag has
|
||||||
|
* attributes, then the second element will be JSONObject containing the
|
||||||
|
* name/value pairs. If the tag contains children, then strings and
|
||||||
|
* JSONArrays will represent the child content and tags.
|
||||||
|
* As opposed to toJSONArray this method does not attempt to convert
|
||||||
|
* any text node or attribute value to any type
|
||||||
|
* but just leaves it as a string.
|
||||||
|
* Comments, prologs, DTDs, and <pre>{@code <[ [ ]]>}</pre> are ignored.
|
||||||
|
* @param x An XMLTokener.
|
||||||
|
* @param config The parser configuration:
|
||||||
|
* JSONMLParserConfiguration.ORIGINAL is the default behaviour;
|
||||||
|
* JSONMLParserConfiguration.KEEP_STRINGS means values will not be coerced into boolean
|
||||||
|
* or numeric values and will instead be left as strings
|
||||||
|
* @return A JSONArray containing the structured data from the XML string.
|
||||||
|
* @throws JSONException Thrown on error converting to a JSONArray
|
||||||
|
*/
|
||||||
|
public static JSONArray toJSONArray(XMLTokener x, JSONMLParserConfiguration config) throws JSONException {
|
||||||
|
return (JSONArray)parse(x, true, null, config, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -288,7 +347,7 @@ public class JSONML {
|
|||||||
* @throws JSONException Thrown on error converting to a JSONArray
|
* @throws JSONException Thrown on error converting to a JSONArray
|
||||||
*/
|
*/
|
||||||
public static JSONArray toJSONArray(XMLTokener x, boolean keepStrings) throws JSONException {
|
public static JSONArray toJSONArray(XMLTokener x, boolean keepStrings) throws JSONException {
|
||||||
return (JSONArray)parse(x, true, null, keepStrings);
|
return (JSONArray)parse(x, true, null, keepStrings, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -305,7 +364,7 @@ public class JSONML {
|
|||||||
* @throws JSONException Thrown on error converting to a JSONArray
|
* @throws JSONException Thrown on error converting to a JSONArray
|
||||||
*/
|
*/
|
||||||
public static JSONArray toJSONArray(XMLTokener x) throws JSONException {
|
public static JSONArray toJSONArray(XMLTokener x) throws JSONException {
|
||||||
return (JSONArray)parse(x, true, null, false);
|
return (JSONArray)parse(x, true, null, false, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -323,7 +382,7 @@ public class JSONML {
|
|||||||
* @throws JSONException Thrown on error converting to a JSONObject
|
* @throws JSONException Thrown on error converting to a JSONObject
|
||||||
*/
|
*/
|
||||||
public static JSONObject toJSONObject(String string) throws JSONException {
|
public static JSONObject toJSONObject(String string) throws JSONException {
|
||||||
return (JSONObject)parse(new XMLTokener(string), false, null, false);
|
return (JSONObject)parse(new XMLTokener(string), false, null, false, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -343,7 +402,29 @@ public class JSONML {
|
|||||||
* @throws JSONException Thrown on error converting to a JSONObject
|
* @throws JSONException Thrown on error converting to a JSONObject
|
||||||
*/
|
*/
|
||||||
public static JSONObject toJSONObject(String string, boolean keepStrings) throws JSONException {
|
public static JSONObject toJSONObject(String string, boolean keepStrings) throws JSONException {
|
||||||
return (JSONObject)parse(new XMLTokener(string), false, null, keepStrings);
|
return (JSONObject)parse(new XMLTokener(string), false, null, keepStrings, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a well-formed (but not necessarily valid) XML string into a
|
||||||
|
* JSONObject using the JsonML transform. Each XML tag is represented as
|
||||||
|
* a JSONObject with a "tagName" property. If the tag has attributes, then
|
||||||
|
* the attributes will be in the JSONObject as properties. If the tag
|
||||||
|
* contains children, the object will have a "childNodes" property which
|
||||||
|
* will be an array of strings and JsonML JSONObjects.
|
||||||
|
|
||||||
|
* Comments, prologs, DTDs, and <pre>{@code <[ [ ]]>}</pre> are ignored.
|
||||||
|
* @param string The XML source text.
|
||||||
|
* @param config The parser configuration:
|
||||||
|
* JSONMLParserConfiguration.ORIGINAL is the default behaviour;
|
||||||
|
* JSONMLParserConfiguration.KEEP_STRINGS means values will not be coerced into boolean
|
||||||
|
* or numeric values and will instead be left as strings
|
||||||
|
* @return A JSONObject containing the structured data from the XML string.
|
||||||
|
* @throws JSONException Thrown on error converting to a JSONObject
|
||||||
|
*/
|
||||||
|
public static JSONObject toJSONObject(String string, JSONMLParserConfiguration config) throws JSONException {
|
||||||
|
return (JSONObject)parse(new XMLTokener(string), false, null, config, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -361,7 +442,7 @@ public class JSONML {
|
|||||||
* @throws JSONException Thrown on error converting to a JSONObject
|
* @throws JSONException Thrown on error converting to a JSONObject
|
||||||
*/
|
*/
|
||||||
public static JSONObject toJSONObject(XMLTokener x) throws JSONException {
|
public static JSONObject toJSONObject(XMLTokener x) throws JSONException {
|
||||||
return (JSONObject)parse(x, false, null, false);
|
return (JSONObject)parse(x, false, null, false, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -381,7 +462,29 @@ public class JSONML {
|
|||||||
* @throws JSONException Thrown on error converting to a JSONObject
|
* @throws JSONException Thrown on error converting to a JSONObject
|
||||||
*/
|
*/
|
||||||
public static JSONObject toJSONObject(XMLTokener x, boolean keepStrings) throws JSONException {
|
public static JSONObject toJSONObject(XMLTokener x, boolean keepStrings) throws JSONException {
|
||||||
return (JSONObject)parse(x, false, null, keepStrings);
|
return (JSONObject)parse(x, false, null, keepStrings, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a well-formed (but not necessarily valid) XML string into a
|
||||||
|
* JSONObject using the JsonML transform. Each XML tag is represented as
|
||||||
|
* a JSONObject with a "tagName" property. If the tag has attributes, then
|
||||||
|
* the attributes will be in the JSONObject as properties. If the tag
|
||||||
|
* contains children, the object will have a "childNodes" property which
|
||||||
|
* will be an array of strings and JsonML JSONObjects.
|
||||||
|
|
||||||
|
* Comments, prologs, DTDs, and <pre>{@code <[ [ ]]>}</pre> are ignored.
|
||||||
|
* @param x An XMLTokener of the XML source text.
|
||||||
|
* @param config The parser configuration:
|
||||||
|
* JSONMLParserConfiguration.ORIGINAL is the default behaviour;
|
||||||
|
* JSONMLParserConfiguration.KEEP_STRINGS means values will not be coerced into boolean
|
||||||
|
* or numeric values and will instead be left as strings
|
||||||
|
* @return A JSONObject containing the structured data from the XML string.
|
||||||
|
* @throws JSONException Thrown on error converting to a JSONObject
|
||||||
|
*/
|
||||||
|
public static JSONObject toJSONObject(XMLTokener x, JSONMLParserConfiguration config) throws JSONException {
|
||||||
|
return (JSONObject)parse(x, false, null, config, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -462,6 +565,7 @@ public class JSONML {
|
|||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reverse the JSONML transformation, making an XML text from a JSONObject.
|
* Reverse the JSONML transformation, making an XML text from a JSONObject.
|
||||||
* The JSONObject must contain a "tagName" property. If it has children,
|
* The JSONObject must contain a "tagName" property. If it has children,
|
||||||
|
|||||||
128
src/main/java/org/json/JSONMLParserConfiguration.java
Normal file
128
src/main/java/org/json/JSONMLParserConfiguration.java
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
package org.json;
|
||||||
|
/*
|
||||||
|
Public Domain.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configuration object for the XML to JSONML parser. The configuration is immutable.
|
||||||
|
*/
|
||||||
|
@SuppressWarnings({""})
|
||||||
|
public class JSONMLParserConfiguration {
|
||||||
|
/**
|
||||||
|
* Used to indicate there's no defined limit to the maximum nesting depth when parsing a XML
|
||||||
|
* document to JSONML.
|
||||||
|
*/
|
||||||
|
public static final int UNDEFINED_MAXIMUM_NESTING_DEPTH = -1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The default maximum nesting depth when parsing a XML document to JSONML.
|
||||||
|
*/
|
||||||
|
public static final int DEFAULT_MAXIMUM_NESTING_DEPTH = 512;
|
||||||
|
|
||||||
|
/** Original Configuration of the XML to JSONML Parser. */
|
||||||
|
public static final JSONMLParserConfiguration ORIGINAL
|
||||||
|
= new JSONMLParserConfiguration();
|
||||||
|
/** Original configuration of the XML to JSONML Parser except that values are kept as strings. */
|
||||||
|
public static final JSONMLParserConfiguration KEEP_STRINGS
|
||||||
|
= new JSONMLParserConfiguration().withKeepStrings(true);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When parsing the XML into JSONML, specifies if values should be kept as strings (<code>true</code>), or if
|
||||||
|
* they should try to be guessed into JSON values (numeric, boolean, string)
|
||||||
|
*/
|
||||||
|
private boolean keepStrings;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The maximum nesting depth when parsing a XML document to JSONML.
|
||||||
|
*/
|
||||||
|
private int maxNestingDepth = DEFAULT_MAXIMUM_NESTING_DEPTH;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default parser configuration. Does not keep strings (tries to implicitly convert values).
|
||||||
|
*/
|
||||||
|
public JSONMLParserConfiguration() {
|
||||||
|
this.keepStrings = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configure the parser string processing and use the default CDATA Tag Name as "content".
|
||||||
|
* @param keepStrings <code>true</code> to parse all values as string.
|
||||||
|
* <code>false</code> to try and convert XML string values into a JSON value.
|
||||||
|
* @param maxNestingDepth <code>int</code> to limit the nesting depth
|
||||||
|
*/
|
||||||
|
private JSONMLParserConfiguration(final boolean keepStrings, final int maxNestingDepth) {
|
||||||
|
this.keepStrings = keepStrings;
|
||||||
|
this.maxNestingDepth = maxNestingDepth;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides a new instance of the same configuration.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected JSONMLParserConfiguration clone() {
|
||||||
|
// future modifications to this method should always ensure a "deep"
|
||||||
|
// clone in the case of collections. i.e. if a Map is added as a configuration
|
||||||
|
// item, a new map instance should be created and if possible each value in the
|
||||||
|
// map should be cloned as well. If the values of the map are known to also
|
||||||
|
// be immutable, then a shallow clone of the map is acceptable.
|
||||||
|
return new JSONMLParserConfiguration(
|
||||||
|
this.keepStrings,
|
||||||
|
this.maxNestingDepth
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When parsing the XML into JSONML, specifies if values should be kept as strings (<code>true</code>), or if
|
||||||
|
* they should try to be guessed into JSON values (numeric, boolean, string)
|
||||||
|
*
|
||||||
|
* @return The <code>keepStrings</code> configuration value.
|
||||||
|
*/
|
||||||
|
public boolean isKeepStrings() {
|
||||||
|
return this.keepStrings;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When parsing the XML into JSONML, specifies if values should be kept as strings (<code>true</code>), or if
|
||||||
|
* they should try to be guessed into JSON values (numeric, boolean, string)
|
||||||
|
*
|
||||||
|
* @param newVal
|
||||||
|
* new value to use for the <code>keepStrings</code> configuration option.
|
||||||
|
*
|
||||||
|
* @return The existing configuration will not be modified. A new configuration is returned.
|
||||||
|
*/
|
||||||
|
public JSONMLParserConfiguration withKeepStrings(final boolean newVal) {
|
||||||
|
JSONMLParserConfiguration newConfig = this.clone();
|
||||||
|
newConfig.keepStrings = newVal;
|
||||||
|
return newConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The maximum nesting depth that the parser will descend before throwing an exception
|
||||||
|
* when parsing the XML into JSONML.
|
||||||
|
* @return the maximum nesting depth set for this configuration
|
||||||
|
*/
|
||||||
|
public int getMaxNestingDepth() {
|
||||||
|
return maxNestingDepth;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines the maximum nesting depth that the parser will descend before throwing an exception
|
||||||
|
* when parsing the XML into JSONML. The default max nesting depth is 512, which means the parser
|
||||||
|
* will throw a JsonException if the maximum depth is reached.
|
||||||
|
* Using any negative value as a parameter is equivalent to setting no limit to the nesting depth,
|
||||||
|
* which means the parses will go as deep as the maximum call stack size allows.
|
||||||
|
* @param maxNestingDepth the maximum nesting depth allowed to the XML parser
|
||||||
|
* @return The existing configuration will not be modified. A new configuration is returned.
|
||||||
|
*/
|
||||||
|
public JSONMLParserConfiguration withMaxNestingDepth(int maxNestingDepth) {
|
||||||
|
JSONMLParserConfiguration newConfig = this.clone();
|
||||||
|
|
||||||
|
if (maxNestingDepth > UNDEFINED_MAXIMUM_NESTING_DEPTH) {
|
||||||
|
newConfig.maxNestingDepth = maxNestingDepth;
|
||||||
|
} else {
|
||||||
|
newConfig.maxNestingDepth = UNDEFINED_MAXIMUM_NESTING_DEPTH;
|
||||||
|
}
|
||||||
|
|
||||||
|
return newConfig;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,31 +1,10 @@
|
|||||||
package org.json;
|
package org.json;
|
||||||
|
|
||||||
import java.io.Closeable;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2002 JSON.org
|
Public Domain.
|
||||||
|
*/
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
import java.io.Closeable;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.StringWriter;
|
import java.io.StringWriter;
|
||||||
import java.io.Writer;
|
import java.io.Writer;
|
||||||
@@ -166,6 +145,10 @@ public class JSONObject {
|
|||||||
*/
|
*/
|
||||||
private final Map<String, Object> map;
|
private final Map<String, Object> map;
|
||||||
|
|
||||||
|
public Class<? extends Map> getMapType() {
|
||||||
|
return map.getClass();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* It is sometimes more convenient and less ambiguous to have a
|
* It is sometimes more convenient and less ambiguous to have a
|
||||||
* <code>NULL</code> object than to use Java's <code>null</code> value.
|
* <code>NULL</code> object than to use Java's <code>null</code> value.
|
||||||
@@ -2142,6 +2125,10 @@ public class JSONObject {
|
|||||||
if (!isNumberSimilar((Number)valueThis, (Number)valueOther)) {
|
if (!isNumberSimilar((Number)valueThis, (Number)valueOther)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
} else if (valueThis instanceof JSONString && valueOther instanceof JSONString) {
|
||||||
|
if (!((JSONString) valueThis).toJSONString().equals(((JSONString) valueOther).toJSONString())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
} else if (!valueThis.equals(valueOther)) {
|
} else if (!valueThis.equals(valueOther)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,27 +10,7 @@ import java.util.Collections;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2002 JSON.org
|
Public Domain.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,27 +1,7 @@
|
|||||||
package org.json;
|
package org.json;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2002 JSON.org
|
Public Domain.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,27 +1,7 @@
|
|||||||
package org.json;
|
package org.json;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2018 JSON.org
|
Public Domain.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import static java.lang.annotation.ElementType.METHOD;
|
import static java.lang.annotation.ElementType.METHOD;
|
||||||
@@ -31,13 +11,13 @@ import java.lang.annotation.Documented;
|
|||||||
import java.lang.annotation.Retention;
|
import java.lang.annotation.Retention;
|
||||||
import java.lang.annotation.Target;
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
@Documented
|
|
||||||
@Retention(RUNTIME)
|
|
||||||
@Target({METHOD})
|
|
||||||
/**
|
/**
|
||||||
* Use this annotation on a getter method to override the Bean name
|
* Use this annotation on a getter method to override the Bean name
|
||||||
* parser for Bean -> JSONObject mapping. If this annotation is
|
* parser for Bean -> JSONObject mapping. If this annotation is
|
||||||
* present at any level in the class hierarchy, then the method will
|
* present at any level in the class hierarchy, then the method will
|
||||||
* not be serialized from the bean into the JSONObject.
|
* not be serialized from the bean into the JSONObject.
|
||||||
*/
|
*/
|
||||||
|
@Documented
|
||||||
|
@Retention(RUNTIME)
|
||||||
|
@Target({METHOD})
|
||||||
public @interface JSONPropertyIgnore { }
|
public @interface JSONPropertyIgnore { }
|
||||||
|
|||||||
@@ -1,27 +1,7 @@
|
|||||||
package org.json;
|
package org.json;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2018 JSON.org
|
Public Domain.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import static java.lang.annotation.ElementType.METHOD;
|
import static java.lang.annotation.ElementType.METHOD;
|
||||||
@@ -31,14 +11,14 @@ import java.lang.annotation.Documented;
|
|||||||
import java.lang.annotation.Retention;
|
import java.lang.annotation.Retention;
|
||||||
import java.lang.annotation.Target;
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
@Documented
|
|
||||||
@Retention(RUNTIME)
|
|
||||||
@Target({METHOD})
|
|
||||||
/**
|
/**
|
||||||
* Use this annotation on a getter method to override the Bean name
|
* Use this annotation on a getter method to override the Bean name
|
||||||
* parser for Bean -> JSONObject mapping. A value set to empty string <code>""</code>
|
* parser for Bean -> JSONObject mapping. A value set to empty string <code>""</code>
|
||||||
* will have the Bean parser fall back to the default field name processing.
|
* will have the Bean parser fall back to the default field name processing.
|
||||||
*/
|
*/
|
||||||
|
@Documented
|
||||||
|
@Retention(RUNTIME)
|
||||||
|
@Target({METHOD})
|
||||||
public @interface JSONPropertyName {
|
public @interface JSONPropertyName {
|
||||||
/**
|
/**
|
||||||
* @return The name of the property as to be used in the JSON Object.
|
* @return The name of the property as to be used in the JSON Object.
|
||||||
|
|||||||
@@ -1,27 +1,7 @@
|
|||||||
package org.json;
|
package org.json;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2002 JSON.org
|
Public Domain.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,27 +1,7 @@
|
|||||||
package org.json;
|
package org.json;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2006 JSON.org
|
Public Domain.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import java.io.StringWriter;
|
import java.io.StringWriter;
|
||||||
|
|||||||
@@ -8,27 +8,7 @@ import java.io.Reader;
|
|||||||
import java.io.StringReader;
|
import java.io.StringReader;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2002 JSON.org
|
Public Domain.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -5,27 +5,7 @@ import java.util.Collection;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2006 JSON.org
|
Public Domain.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,27 +1,7 @@
|
|||||||
package org.json;
|
package org.json;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2002 JSON.org
|
Public Domain.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import java.util.Enumeration;
|
import java.util.Enumeration;
|
||||||
|
|||||||
@@ -1,27 +1,7 @@
|
|||||||
package org.json;
|
package org.json;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2015 JSON.org
|
Public Domain.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import java.io.Reader;
|
import java.io.Reader;
|
||||||
@@ -249,10 +229,14 @@ public class XML {
|
|||||||
* The JSONObject that will include the new material.
|
* The JSONObject that will include the new material.
|
||||||
* @param name
|
* @param name
|
||||||
* The tag name.
|
* The tag name.
|
||||||
|
* @param config
|
||||||
|
* The XML parser configuration.
|
||||||
|
* @param currentNestingDepth
|
||||||
|
* The current nesting depth.
|
||||||
* @return true if the close tag is processed.
|
* @return true if the close tag is processed.
|
||||||
* @throws JSONException
|
* @throws JSONException Thrown if any parsing error occurs.
|
||||||
*/
|
*/
|
||||||
private static boolean parse(XMLTokener x, JSONObject context, String name, XMLParserConfiguration config)
|
private static boolean parse(XMLTokener x, JSONObject context, String name, XMLParserConfiguration config, int currentNestingDepth)
|
||||||
throws JSONException {
|
throws JSONException {
|
||||||
char c;
|
char c;
|
||||||
int i;
|
int i;
|
||||||
@@ -422,7 +406,11 @@ public class XML {
|
|||||||
|
|
||||||
} else if (token == LT) {
|
} else if (token == LT) {
|
||||||
// Nested element
|
// Nested element
|
||||||
if (parse(x, jsonObject, tagName, config)) {
|
if (currentNestingDepth == config.getMaxNestingDepth()) {
|
||||||
|
throw x.syntaxError("Maximum nesting depth of " + config.getMaxNestingDepth() + " reached");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parse(x, jsonObject, tagName, config, currentNestingDepth + 1)) {
|
||||||
if (config.getForceList().contains(tagName)) {
|
if (config.getForceList().contains(tagName)) {
|
||||||
// Force the value to be an array
|
// Force the value to be an array
|
||||||
if (jsonObject.length() == 0) {
|
if (jsonObject.length() == 0) {
|
||||||
@@ -675,7 +663,7 @@ public class XML {
|
|||||||
while (x.more()) {
|
while (x.more()) {
|
||||||
x.skipPast("<");
|
x.skipPast("<");
|
||||||
if(x.more()) {
|
if(x.more()) {
|
||||||
parse(x, jo, null, config);
|
parse(x, jo, null, config, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return jo;
|
return jo;
|
||||||
@@ -772,6 +760,28 @@ public class XML {
|
|||||||
*/
|
*/
|
||||||
public static String toString(final Object object, final String tagName, final XMLParserConfiguration config)
|
public static String toString(final Object object, final String tagName, final XMLParserConfiguration config)
|
||||||
throws JSONException {
|
throws JSONException {
|
||||||
|
return toString(object, tagName, config, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a JSONObject into a well-formed, element-normal XML string,
|
||||||
|
* either pretty print or single-lined depending on indent factor.
|
||||||
|
*
|
||||||
|
* @param object
|
||||||
|
* A JSONObject.
|
||||||
|
* @param tagName
|
||||||
|
* The optional name of the enclosing tag.
|
||||||
|
* @param config
|
||||||
|
* Configuration that can control output to XML.
|
||||||
|
* @param indentFactor
|
||||||
|
* The number of spaces to add to each level of indentation.
|
||||||
|
* @param indent
|
||||||
|
* The current ident level in spaces.
|
||||||
|
* @return
|
||||||
|
* @throws JSONException
|
||||||
|
*/
|
||||||
|
private static String toString(final Object object, final String tagName, final XMLParserConfiguration config, int indentFactor, int indent)
|
||||||
|
throws JSONException {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
JSONArray ja;
|
JSONArray ja;
|
||||||
JSONObject jo;
|
JSONObject jo;
|
||||||
@@ -781,9 +791,14 @@ public class XML {
|
|||||||
|
|
||||||
// Emit <tagName>
|
// Emit <tagName>
|
||||||
if (tagName != null) {
|
if (tagName != null) {
|
||||||
|
sb.append(indent(indent));
|
||||||
sb.append('<');
|
sb.append('<');
|
||||||
sb.append(tagName);
|
sb.append(tagName);
|
||||||
sb.append('>');
|
sb.append('>');
|
||||||
|
if(indentFactor > 0){
|
||||||
|
sb.append("\n");
|
||||||
|
indent += indentFactor;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Loop thru the keys.
|
// Loop thru the keys.
|
||||||
@@ -826,31 +841,39 @@ public class XML {
|
|||||||
sb.append('<');
|
sb.append('<');
|
||||||
sb.append(key);
|
sb.append(key);
|
||||||
sb.append('>');
|
sb.append('>');
|
||||||
sb.append(toString(val, null, config));
|
sb.append(toString(val, null, config, indentFactor, indent));
|
||||||
sb.append("</");
|
sb.append("</");
|
||||||
sb.append(key);
|
sb.append(key);
|
||||||
sb.append('>');
|
sb.append('>');
|
||||||
} else {
|
} else {
|
||||||
sb.append(toString(val, key, config));
|
sb.append(toString(val, key, config, indentFactor, indent));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if ("".equals(value)) {
|
} else if ("".equals(value)) {
|
||||||
|
sb.append(indent(indent));
|
||||||
sb.append('<');
|
sb.append('<');
|
||||||
sb.append(key);
|
sb.append(key);
|
||||||
sb.append("/>");
|
sb.append("/>");
|
||||||
|
if(indentFactor > 0){
|
||||||
|
sb.append("\n");
|
||||||
|
}
|
||||||
|
|
||||||
// Emit a new tag <k>
|
// Emit a new tag <k>
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
sb.append(toString(value, key, config));
|
sb.append(toString(value, key, config, indentFactor, indent));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (tagName != null) {
|
if (tagName != null) {
|
||||||
|
|
||||||
// Emit the </tagName> close tag
|
// Emit the </tagName> close tag
|
||||||
|
sb.append(indent(indent - indentFactor));
|
||||||
sb.append("</");
|
sb.append("</");
|
||||||
sb.append(tagName);
|
sb.append(tagName);
|
||||||
sb.append('>');
|
sb.append('>');
|
||||||
|
if(indentFactor > 0){
|
||||||
|
sb.append("\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
|
|
||||||
@@ -869,15 +892,85 @@ public class XML {
|
|||||||
// XML does not have good support for arrays. If an array
|
// XML does not have good support for arrays. If an array
|
||||||
// appears in a place where XML is lacking, synthesize an
|
// appears in a place where XML is lacking, synthesize an
|
||||||
// <array> element.
|
// <array> element.
|
||||||
sb.append(toString(val, tagName == null ? "array" : tagName, config));
|
sb.append(toString(val, tagName == null ? "array" : tagName, config, indentFactor, indent));
|
||||||
}
|
}
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
string = (object == null) ? "null" : escape(object.toString());
|
|
||||||
return (tagName == null) ? "\"" + string + "\""
|
|
||||||
: (string.length() == 0) ? "<" + tagName + "/>" : "<" + tagName
|
|
||||||
+ ">" + string + "</" + tagName + ">";
|
|
||||||
|
|
||||||
|
string = (object == null) ? "null" : escape(object.toString());
|
||||||
|
|
||||||
|
if(tagName == null){
|
||||||
|
return indent(indent) + "\"" + string + "\"" + ((indentFactor > 0) ? "\n" : "");
|
||||||
|
} else if(string.length() == 0){
|
||||||
|
return indent(indent) + "<" + tagName + "/>" + ((indentFactor > 0) ? "\n" : "");
|
||||||
|
} else {
|
||||||
|
return indent(indent) + "<" + tagName
|
||||||
|
+ ">" + string + "</" + tagName + ">" + ((indentFactor > 0) ? "\n" : "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a JSONObject into a well-formed, pretty printed element-normal XML string.
|
||||||
|
*
|
||||||
|
* @param object
|
||||||
|
* A JSONObject.
|
||||||
|
* @param indentFactor
|
||||||
|
* The number of spaces to add to each level of indentation.
|
||||||
|
* @return A string.
|
||||||
|
* @throws JSONException Thrown if there is an error parsing the string
|
||||||
|
*/
|
||||||
|
public static String toString(Object object, int indentFactor){
|
||||||
|
return toString(object, null, XMLParserConfiguration.ORIGINAL, indentFactor);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a JSONObject into a well-formed, pretty printed element-normal XML string.
|
||||||
|
*
|
||||||
|
* @param object
|
||||||
|
* A JSONObject.
|
||||||
|
* @param tagName
|
||||||
|
* The optional name of the enclosing tag.
|
||||||
|
* @param indentFactor
|
||||||
|
* The number of spaces to add to each level of indentation.
|
||||||
|
* @return A string.
|
||||||
|
* @throws JSONException Thrown if there is an error parsing the string
|
||||||
|
*/
|
||||||
|
public static String toString(final Object object, final String tagName, int indentFactor) {
|
||||||
|
return toString(object, tagName, XMLParserConfiguration.ORIGINAL, indentFactor);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a JSONObject into a well-formed, pretty printed element-normal XML string.
|
||||||
|
*
|
||||||
|
* @param object
|
||||||
|
* A JSONObject.
|
||||||
|
* @param tagName
|
||||||
|
* The optional name of the enclosing tag.
|
||||||
|
* @param config
|
||||||
|
* Configuration that can control output to XML.
|
||||||
|
* @param indentFactor
|
||||||
|
* The number of spaces to add to each level of indentation.
|
||||||
|
* @return A string.
|
||||||
|
* @throws JSONException Thrown if there is an error parsing the string
|
||||||
|
*/
|
||||||
|
public static String toString(final Object object, final String tagName, final XMLParserConfiguration config, int indentFactor)
|
||||||
|
throws JSONException {
|
||||||
|
return toString(object, tagName, config, indentFactor, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a String consisting of a number of space characters specified by indent
|
||||||
|
*
|
||||||
|
* @param indent
|
||||||
|
* The number of spaces to be appended to the String.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private static final String indent(int indent) {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
for (int i = 0; i < indent; i++) {
|
||||||
|
sb.append(' ');
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,26 +1,6 @@
|
|||||||
package org.json;
|
package org.json;
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2002 JSON.org
|
Public Domain.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
@@ -36,6 +16,17 @@ import java.util.Set;
|
|||||||
*/
|
*/
|
||||||
@SuppressWarnings({""})
|
@SuppressWarnings({""})
|
||||||
public class XMLParserConfiguration {
|
public class XMLParserConfiguration {
|
||||||
|
/**
|
||||||
|
* Used to indicate there's no defined limit to the maximum nesting depth when parsing a XML
|
||||||
|
* document to JSON.
|
||||||
|
*/
|
||||||
|
public static final int UNDEFINED_MAXIMUM_NESTING_DEPTH = -1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The default maximum nesting depth when parsing a XML document to JSON.
|
||||||
|
*/
|
||||||
|
public static final int DEFAULT_MAXIMUM_NESTING_DEPTH = 512;
|
||||||
|
|
||||||
/** Original Configuration of the XML Parser. */
|
/** Original Configuration of the XML Parser. */
|
||||||
public static final XMLParserConfiguration ORIGINAL
|
public static final XMLParserConfiguration ORIGINAL
|
||||||
= new XMLParserConfiguration();
|
= new XMLParserConfiguration();
|
||||||
@@ -74,6 +65,11 @@ public class XMLParserConfiguration {
|
|||||||
*/
|
*/
|
||||||
private Set<String> forceList;
|
private Set<String> forceList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The maximum nesting depth when parsing a XML document to JSON.
|
||||||
|
*/
|
||||||
|
private int maxNestingDepth = DEFAULT_MAXIMUM_NESTING_DEPTH;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default parser configuration. Does not keep strings (tries to implicitly convert
|
* Default parser configuration. Does not keep strings (tries to implicitly convert
|
||||||
* values), and the CDATA Tag Name is "content".
|
* values), and the CDATA Tag Name is "content".
|
||||||
@@ -161,14 +157,17 @@ public class XMLParserConfiguration {
|
|||||||
* @param xsiTypeMap <code>new HashMap<String, XMLXsiTypeConverter<?>>()</code> to parse values with attribute
|
* @param xsiTypeMap <code>new HashMap<String, XMLXsiTypeConverter<?>>()</code> to parse values with attribute
|
||||||
* xsi:type="integer" as integer, xsi:type="string" as string
|
* xsi:type="integer" as integer, xsi:type="string" as string
|
||||||
* @param forceList <code>new HashSet<String>()</code> to parse the provided tags' values as arrays
|
* @param forceList <code>new HashSet<String>()</code> to parse the provided tags' values as arrays
|
||||||
|
* @param maxNestingDepth <code>int</code> to limit the nesting depth
|
||||||
*/
|
*/
|
||||||
private XMLParserConfiguration (final boolean keepStrings, final String cDataTagName,
|
private XMLParserConfiguration (final boolean keepStrings, final String cDataTagName,
|
||||||
final boolean convertNilAttributeToNull, final Map<String, XMLXsiTypeConverter<?>> xsiTypeMap, final Set<String> forceList ) {
|
final boolean convertNilAttributeToNull, final Map<String, XMLXsiTypeConverter<?>> xsiTypeMap, final Set<String> forceList,
|
||||||
|
final int maxNestingDepth) {
|
||||||
this.keepStrings = keepStrings;
|
this.keepStrings = keepStrings;
|
||||||
this.cDataTagName = cDataTagName;
|
this.cDataTagName = cDataTagName;
|
||||||
this.convertNilAttributeToNull = convertNilAttributeToNull;
|
this.convertNilAttributeToNull = convertNilAttributeToNull;
|
||||||
this.xsiTypeMap = Collections.unmodifiableMap(xsiTypeMap);
|
this.xsiTypeMap = Collections.unmodifiableMap(xsiTypeMap);
|
||||||
this.forceList = Collections.unmodifiableSet(forceList);
|
this.forceList = Collections.unmodifiableSet(forceList);
|
||||||
|
this.maxNestingDepth = maxNestingDepth;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -186,7 +185,8 @@ public class XMLParserConfiguration {
|
|||||||
this.cDataTagName,
|
this.cDataTagName,
|
||||||
this.convertNilAttributeToNull,
|
this.convertNilAttributeToNull,
|
||||||
this.xsiTypeMap,
|
this.xsiTypeMap,
|
||||||
this.forceList
|
this.forceList,
|
||||||
|
this.maxNestingDepth
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -317,4 +317,34 @@ public class XMLParserConfiguration {
|
|||||||
newConfig.forceList = Collections.unmodifiableSet(cloneForceList);
|
newConfig.forceList = Collections.unmodifiableSet(cloneForceList);
|
||||||
return newConfig;
|
return newConfig;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The maximum nesting depth that the parser will descend before throwing an exception
|
||||||
|
* when parsing the XML into JSON.
|
||||||
|
* @return the maximum nesting depth set for this configuration
|
||||||
|
*/
|
||||||
|
public int getMaxNestingDepth() {
|
||||||
|
return maxNestingDepth;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines the maximum nesting depth that the parser will descend before throwing an exception
|
||||||
|
* when parsing the XML into JSON. The default max nesting depth is 512, which means the parser
|
||||||
|
* will throw a JsonException if the maximum depth is reached.
|
||||||
|
* Using any negative value as a parameter is equivalent to setting no limit to the nesting depth,
|
||||||
|
* which means the parses will go as deep as the maximum call stack size allows.
|
||||||
|
* @param maxNestingDepth the maximum nesting depth allowed to the XML parser
|
||||||
|
* @return The existing configuration will not be modified. A new configuration is returned.
|
||||||
|
*/
|
||||||
|
public XMLParserConfiguration withMaxNestingDepth(int maxNestingDepth) {
|
||||||
|
XMLParserConfiguration newConfig = this.clone();
|
||||||
|
|
||||||
|
if (maxNestingDepth > UNDEFINED_MAXIMUM_NESTING_DEPTH) {
|
||||||
|
newConfig.maxNestingDepth = maxNestingDepth;
|
||||||
|
} else {
|
||||||
|
newConfig.maxNestingDepth = UNDEFINED_MAXIMUM_NESTING_DEPTH;
|
||||||
|
}
|
||||||
|
|
||||||
|
return newConfig;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,27 +1,7 @@
|
|||||||
package org.json;
|
package org.json;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2002 JSON.org
|
Public Domain.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import java.io.Reader;
|
import java.io.Reader;
|
||||||
|
|||||||
@@ -1,26 +1,6 @@
|
|||||||
package org.json;
|
package org.json;
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2002 JSON.org
|
Public Domain.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,27 +1,7 @@
|
|||||||
package org.json.junit;
|
package org.json.junit;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2020 JSON.org
|
Public Domain.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import static org.junit.Assert.*;
|
import static org.junit.Assert.*;
|
||||||
|
|||||||
@@ -1,27 +1,7 @@
|
|||||||
package org.json.junit;
|
package org.json.junit;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2020 JSON.org
|
Public Domain.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import static org.junit.Assert.*;
|
import static org.junit.Assert.*;
|
||||||
|
|||||||
@@ -1,27 +1,7 @@
|
|||||||
package org.json.junit;
|
package org.json.junit;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2020 JSON.org
|
Public Domain.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import static org.junit.Assert.*;
|
import static org.junit.Assert.*;
|
||||||
|
|||||||
@@ -1,27 +1,7 @@
|
|||||||
package org.json.junit;
|
package org.json.junit;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2020 JSON.org
|
Public Domain.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|||||||
@@ -1,27 +1,7 @@
|
|||||||
package org.json.junit;
|
package org.json.junit;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2020 JSON.org
|
Public Domain.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import static org.junit.Assert.*;
|
import static org.junit.Assert.*;
|
||||||
|
|||||||
@@ -1,27 +1,7 @@
|
|||||||
package org.json.junit;
|
package org.json.junit;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2020 JSON.org
|
Public Domain.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
@@ -49,7 +29,9 @@ import org.json.JSONArray;
|
|||||||
import org.json.JSONException;
|
import org.json.JSONException;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
import org.json.JSONPointerException;
|
import org.json.JSONPointerException;
|
||||||
|
import org.json.JSONString;
|
||||||
import org.json.JSONTokener;
|
import org.json.JSONTokener;
|
||||||
|
import org.json.junit.data.MyJsonString;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import com.jayway.jsonpath.Configuration;
|
import com.jayway.jsonpath.Configuration;
|
||||||
@@ -237,6 +219,10 @@ public class JSONArrayTest {
|
|||||||
assertTrue(
|
assertTrue(
|
||||||
"The RAW Collection should give me the same as the Typed Collection",
|
"The RAW Collection should give me the same as the Typed Collection",
|
||||||
expected.similar(jaObj));
|
expected.similar(jaObj));
|
||||||
|
Util.checkJSONArrayMaps(expected);
|
||||||
|
Util.checkJSONArrayMaps(jaObj);
|
||||||
|
Util.checkJSONArrayMaps(jaRaw);
|
||||||
|
Util.checkJSONArrayMaps(jaInt);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -275,6 +261,7 @@ public class JSONArrayTest {
|
|||||||
myList.get(i),
|
myList.get(i),
|
||||||
jsonArray.getString(myInts.length + i));
|
jsonArray.getString(myInts.length + i));
|
||||||
}
|
}
|
||||||
|
Util.checkJSONArrayMaps(jsonArray);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -308,6 +295,9 @@ public class JSONArrayTest {
|
|||||||
assertTrue(
|
assertTrue(
|
||||||
"The RAW Collection should give me the same as the Typed Collection",
|
"The RAW Collection should give me the same as the Typed Collection",
|
||||||
expected.similar(jaInt));
|
expected.similar(jaInt));
|
||||||
|
Util.checkJSONArraysMaps(new ArrayList<JSONArray>(Arrays.asList(
|
||||||
|
jaRaw, jaObj, jaInt
|
||||||
|
)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -351,6 +341,9 @@ public class JSONArrayTest {
|
|||||||
assertTrue(
|
assertTrue(
|
||||||
"The RAW Collection should give me the same as the Typed Collection",
|
"The RAW Collection should give me the same as the Typed Collection",
|
||||||
expected.similar(jaObjObj));
|
expected.similar(jaObjObj));
|
||||||
|
Util.checkJSONArraysMaps(new ArrayList<JSONArray>(Arrays.asList(
|
||||||
|
expected, jaRaw, jaStrObj, jaStrInt, jaObjObj
|
||||||
|
)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -397,6 +390,7 @@ public class JSONArrayTest {
|
|||||||
new Long(-1).equals(jsonArray.getLong(12)));
|
new Long(-1).equals(jsonArray.getLong(12)));
|
||||||
|
|
||||||
assertTrue("Array value null", jsonArray.isNull(-1));
|
assertTrue("Array value null", jsonArray.isNull(-1));
|
||||||
|
Util.checkJSONArrayMaps(jsonArray);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -463,6 +457,7 @@ public class JSONArrayTest {
|
|||||||
assertEquals("Expected an exception message",
|
assertEquals("Expected an exception message",
|
||||||
"JSONArray[5] is not a String (class java.math.BigDecimal : 0.002345).",e.getMessage());
|
"JSONArray[5] is not a String (class java.math.BigDecimal : 0.002345).",e.getMessage());
|
||||||
}
|
}
|
||||||
|
Util.checkJSONArrayMaps(jsonArray);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -499,6 +494,7 @@ public class JSONArrayTest {
|
|||||||
assertTrue("expected value4", "value4".equals(jsonArray.query("/10/key4")));
|
assertTrue("expected value4", "value4".equals(jsonArray.query("/10/key4")));
|
||||||
assertTrue("expected 0", Integer.valueOf(0).equals(jsonArray.query("/11")));
|
assertTrue("expected 0", Integer.valueOf(0).equals(jsonArray.query("/11")));
|
||||||
assertTrue("expected \"-1\"", "-1".equals(jsonArray.query("/12")));
|
assertTrue("expected \"-1\"", "-1".equals(jsonArray.query("/12")));
|
||||||
|
Util.checkJSONArrayMaps(jsonArray);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -512,6 +508,9 @@ public class JSONArrayTest {
|
|||||||
assertTrue("expected JSONArray length 13. instead found "+jsonArray.length(), jsonArray.length() == 13);
|
assertTrue("expected JSONArray length 13. instead found "+jsonArray.length(), jsonArray.length() == 13);
|
||||||
JSONArray nestedJsonArray = jsonArray.getJSONArray(9);
|
JSONArray nestedJsonArray = jsonArray.getJSONArray(9);
|
||||||
assertTrue("expected JSONArray length 1", nestedJsonArray.length() == 1);
|
assertTrue("expected JSONArray length 1", nestedJsonArray.length() == 1);
|
||||||
|
Util.checkJSONArraysMaps(new ArrayList<JSONArray>(Arrays.asList(
|
||||||
|
jsonArray, nestedJsonArray
|
||||||
|
)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -587,6 +586,10 @@ public class JSONArrayTest {
|
|||||||
"hello".equals(jsonArray.optString(4)));
|
"hello".equals(jsonArray.optString(4)));
|
||||||
assertTrue("Array opt string default implicit",
|
assertTrue("Array opt string default implicit",
|
||||||
"".equals(jsonArray.optString(-1)));
|
"".equals(jsonArray.optString(-1)));
|
||||||
|
Util.checkJSONArraysMaps(new ArrayList<JSONArray>(Arrays.asList(
|
||||||
|
jsonArray, nestedJsonArray
|
||||||
|
)));
|
||||||
|
Util.checkJSONObjectMaps(nestedJsonObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -601,7 +604,9 @@ public class JSONArrayTest {
|
|||||||
assertTrue("unexpected optLong value",ja.optLong(0,0)==123);
|
assertTrue("unexpected optLong value",ja.optLong(0,0)==123);
|
||||||
assertTrue("unexpected optDouble value",ja.optDouble(0,0.0)==123.0);
|
assertTrue("unexpected optDouble value",ja.optDouble(0,0.0)==123.0);
|
||||||
assertTrue("unexpected optBigInteger value",ja.optBigInteger(0,BigInteger.ZERO).compareTo(new BigInteger("123"))==0);
|
assertTrue("unexpected optBigInteger value",ja.optBigInteger(0,BigInteger.ZERO).compareTo(new BigInteger("123"))==0);
|
||||||
assertTrue("unexpected optBigDecimal value",ja.optBigDecimal(0,BigDecimal.ZERO).compareTo(new BigDecimal("123"))==0); }
|
assertTrue("unexpected optBigDecimal value",ja.optBigDecimal(0,BigDecimal.ZERO).compareTo(new BigDecimal("123"))==0);
|
||||||
|
Util.checkJSONArrayMaps(ja);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Exercise the JSONArray.put(value) method with various parameters
|
* Exercise the JSONArray.put(value) method with various parameters
|
||||||
@@ -677,6 +682,8 @@ public class JSONArrayTest {
|
|||||||
assertTrue("expected 2 items in [9]", ((List<?>)(JsonPath.read(doc, "$[9]"))).size() == 2);
|
assertTrue("expected 2 items in [9]", ((List<?>)(JsonPath.read(doc, "$[9]"))).size() == 2);
|
||||||
assertTrue("expected 1", Integer.valueOf(1).equals(jsonArray.query("/9/0")));
|
assertTrue("expected 1", Integer.valueOf(1).equals(jsonArray.query("/9/0")));
|
||||||
assertTrue("expected 2", Integer.valueOf(2).equals(jsonArray.query("/9/1")));
|
assertTrue("expected 2", Integer.valueOf(2).equals(jsonArray.query("/9/1")));
|
||||||
|
Util.checkJSONArrayMaps(jsonArray);
|
||||||
|
Util.checkJSONObjectMaps(jsonObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -756,6 +763,8 @@ public class JSONArrayTest {
|
|||||||
assertTrue("expected 2", Integer.valueOf(2).equals(jsonArray.query("/9/1")));
|
assertTrue("expected 2", Integer.valueOf(2).equals(jsonArray.query("/9/1")));
|
||||||
assertTrue("expected 1 item in [10]", ((Map<?,?>)(JsonPath.read(doc, "$[10]"))).size() == 1);
|
assertTrue("expected 1 item in [10]", ((Map<?,?>)(JsonPath.read(doc, "$[10]"))).size() == 1);
|
||||||
assertTrue("expected v1", "v1".equals(jsonArray.query("/10/k1")));
|
assertTrue("expected v1", "v1".equals(jsonArray.query("/10/k1")));
|
||||||
|
Util.checkJSONObjectMaps(jsonObject);
|
||||||
|
Util.checkJSONArrayMaps(jsonArray);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -772,6 +781,7 @@ public class JSONArrayTest {
|
|||||||
jsonArray.remove(0);
|
jsonArray.remove(0);
|
||||||
assertTrue("array should be empty", null == jsonArray.remove(5));
|
assertTrue("array should be empty", null == jsonArray.remove(5));
|
||||||
assertTrue("jsonArray should be empty", jsonArray.isEmpty());
|
assertTrue("jsonArray should be empty", jsonArray.isEmpty());
|
||||||
|
Util.checkJSONArrayMaps(jsonArray);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -811,6 +821,12 @@ public class JSONArrayTest {
|
|||||||
otherJsonArray.put("world");
|
otherJsonArray.put("world");
|
||||||
assertTrue("arrays values differ",
|
assertTrue("arrays values differ",
|
||||||
!jsonArray.similar(otherJsonArray));
|
!jsonArray.similar(otherJsonArray));
|
||||||
|
Util.checkJSONArraysMaps(new ArrayList<JSONArray>(Arrays.asList(
|
||||||
|
jsonArray, otherJsonArray
|
||||||
|
)));
|
||||||
|
Util.checkJSONObjectsMaps(new ArrayList<JSONObject>(Arrays.asList(
|
||||||
|
jsonObject, otherJsonObject
|
||||||
|
)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -894,6 +910,7 @@ public class JSONArrayTest {
|
|||||||
for (String s : jsonArray4Strs) {
|
for (String s : jsonArray4Strs) {
|
||||||
list.contains(s);
|
list.contains(s);
|
||||||
}
|
}
|
||||||
|
Util.checkJSONArrayMaps(jsonArray);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -905,6 +922,9 @@ public class JSONArrayTest {
|
|||||||
JSONArray jsonArray = new JSONArray();
|
JSONArray jsonArray = new JSONArray();
|
||||||
assertTrue("toJSONObject should return null",
|
assertTrue("toJSONObject should return null",
|
||||||
null == jsonArray.toJSONObject(names));
|
null == jsonArray.toJSONObject(names));
|
||||||
|
Util.checkJSONArraysMaps(new ArrayList<JSONArray>(Arrays.asList(
|
||||||
|
names, jsonArray
|
||||||
|
)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -926,6 +946,7 @@ public class JSONArrayTest {
|
|||||||
assertTrue("expected 5", Integer.valueOf(5).equals(jsonArray.query("/4")));
|
assertTrue("expected 5", Integer.valueOf(5).equals(jsonArray.query("/4")));
|
||||||
assertTrue("expected 6", Integer.valueOf(6).equals(jsonArray.query("/5")));
|
assertTrue("expected 6", Integer.valueOf(6).equals(jsonArray.query("/5")));
|
||||||
assertTrue("expected 7", Integer.valueOf(7).equals(jsonArray.query("/6")));
|
assertTrue("expected 7", Integer.valueOf(7).equals(jsonArray.query("/6")));
|
||||||
|
Util.checkJSONArrayMaps(jsonArray);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -968,6 +989,10 @@ public class JSONArrayTest {
|
|||||||
assertTrue("Array value string long",
|
assertTrue("Array value string long",
|
||||||
new Long(-1).equals(Long.parseLong((String) it.next())));
|
new Long(-1).equals(Long.parseLong((String) it.next())));
|
||||||
assertTrue("should be at end of array", !it.hasNext());
|
assertTrue("should be at end of array", !it.hasNext());
|
||||||
|
Util.checkJSONArraysMaps(new ArrayList<JSONArray>(Arrays.asList(
|
||||||
|
jsonArray, nestedJsonArray
|
||||||
|
)));
|
||||||
|
Util.checkJSONObjectMaps(nestedJsonObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expected = JSONPointerException.class)
|
@Test(expected = JSONPointerException.class)
|
||||||
@@ -1010,6 +1035,7 @@ public class JSONArrayTest {
|
|||||||
} finally {
|
} finally {
|
||||||
stringWriter.close();
|
stringWriter.close();
|
||||||
}
|
}
|
||||||
|
Util.checkJSONArrayMaps(jsonArray);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1069,9 +1095,11 @@ public class JSONArrayTest {
|
|||||||
&& actualStr.contains("\"key2\": false")
|
&& actualStr.contains("\"key2\": false")
|
||||||
&& actualStr.contains("\"key3\": 3.14")
|
&& actualStr.contains("\"key3\": 3.14")
|
||||||
);
|
);
|
||||||
|
Util.checkJSONArrayMaps(finalArray);
|
||||||
} finally {
|
} finally {
|
||||||
stringWriter.close();
|
stringWriter.close();
|
||||||
}
|
}
|
||||||
|
Util.checkJSONArrayMaps(jsonArray);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1182,6 +1210,7 @@ public class JSONArrayTest {
|
|||||||
// assert that the new list is mutable
|
// assert that the new list is mutable
|
||||||
assertTrue("Removing an entry should succeed", list.remove(2) != null);
|
assertTrue("Removing an entry should succeed", list.remove(2) != null);
|
||||||
assertTrue("List should have 2 elements", list.size() == 2);
|
assertTrue("List should have 2 elements", list.size() == 2);
|
||||||
|
Util.checkJSONArrayMaps(jsonArray);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1190,13 +1219,13 @@ public class JSONArrayTest {
|
|||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testJSONArrayInt() {
|
public void testJSONArrayInt() {
|
||||||
assertNotNull(new JSONArray(0));
|
assertNotNull(new JSONArray(0));
|
||||||
assertNotNull(new JSONArray(5));
|
assertNotNull(new JSONArray(5));
|
||||||
// Check Size -> Even though the capacity of the JSONArray can be specified using a positive
|
// Check Size -> Even though the capacity of the JSONArray can be specified using a positive
|
||||||
// integer but the length of JSONArray always reflects upon the items added into it.
|
// integer but the length of JSONArray always reflects upon the items added into it.
|
||||||
assertEquals(0l, new JSONArray(10).length());
|
// assertEquals(0l, new JSONArray(10).length());
|
||||||
try {
|
try {
|
||||||
assertNotNull("Should throw an exception", new JSONArray(-1));
|
assertNotNull("Should throw an exception", new JSONArray(-1));
|
||||||
} catch (JSONException e) {
|
} catch (JSONException e) {
|
||||||
assertEquals("Expected an exception message",
|
assertEquals("Expected an exception message",
|
||||||
"JSONArray initial capacity cannot be negative.",
|
"JSONArray initial capacity cannot be negative.",
|
||||||
@@ -1223,8 +1252,8 @@ public class JSONArrayTest {
|
|||||||
((Collection<Object>)o).add("test");
|
((Collection<Object>)o).add("test");
|
||||||
((Collection<Object>)o).add(false);
|
((Collection<Object>)o).add(false);
|
||||||
try {
|
try {
|
||||||
a = new JSONArray(o);
|
JSONArray a0 = new JSONArray(o);
|
||||||
assertNull("Should error", a);
|
assertNull("Should error", a0);
|
||||||
} catch (JSONException ex) {
|
} catch (JSONException ex) {
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1232,10 +1261,11 @@ public class JSONArrayTest {
|
|||||||
// this is required for backwards compatibility
|
// this is required for backwards compatibility
|
||||||
o = a;
|
o = a;
|
||||||
try {
|
try {
|
||||||
a = new JSONArray(o);
|
JSONArray a1 = new JSONArray(o);
|
||||||
assertNull("Should error", a);
|
assertNull("Should error", a1);
|
||||||
} catch (JSONException ex) {
|
} catch (JSONException ex) {
|
||||||
}
|
}
|
||||||
|
Util.checkJSONArrayMaps(a);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1252,6 +1282,9 @@ public class JSONArrayTest {
|
|||||||
for(int i = 0; i < a1.length(); i++) {
|
for(int i = 0; i < a1.length(); i++) {
|
||||||
assertEquals("index " + i + " are equal", a1.get(i), a2.get(i));
|
assertEquals("index " + i + " are equal", a1.get(i), a2.get(i));
|
||||||
}
|
}
|
||||||
|
Util.checkJSONArraysMaps(new ArrayList<JSONArray>(Arrays.asList(
|
||||||
|
a1, a2
|
||||||
|
)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1269,6 +1302,9 @@ public class JSONArrayTest {
|
|||||||
for(int i = 0; i < a1.length(); i++) {
|
for(int i = 0; i < a1.length(); i++) {
|
||||||
assertEquals("index " + i + " are equal", a1.get(i), a2.get(i));
|
assertEquals("index " + i + " are equal", a1.get(i), a2.get(i));
|
||||||
}
|
}
|
||||||
|
Util.checkJSONArraysMaps(new ArrayList<JSONArray>(Arrays.asList(
|
||||||
|
a1, a2
|
||||||
|
)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1284,6 +1320,7 @@ public class JSONArrayTest {
|
|||||||
jsonArray.clear(); //Clears the JSONArray
|
jsonArray.clear(); //Clears the JSONArray
|
||||||
assertTrue("expected jsonArray.length() == 0", jsonArray.length() == 0); //Check if its length is 0
|
assertTrue("expected jsonArray.length() == 0", jsonArray.length() == 0); //Check if its length is 0
|
||||||
jsonArray.getInt(0); //Should throws org.json.JSONException: JSONArray[0] not found
|
jsonArray.getInt(0); //Should throws org.json.JSONException: JSONArray[0] not found
|
||||||
|
Util.checkJSONArrayMaps(jsonArray);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1297,5 +1334,27 @@ public class JSONArrayTest {
|
|||||||
JSONArray json_input = new JSONArray(tokener);
|
JSONArray json_input = new JSONArray(tokener);
|
||||||
assertNotNull(json_input);
|
assertNotNull(json_input);
|
||||||
fail("Excepected Exception.");
|
fail("Excepected Exception.");
|
||||||
|
Util.checkJSONArrayMaps(json_input);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIssue682SimilarityOfJSONString() {
|
||||||
|
JSONArray ja1 = new JSONArray()
|
||||||
|
.put(new MyJsonString())
|
||||||
|
.put(2);
|
||||||
|
JSONArray ja2 = new JSONArray()
|
||||||
|
.put(new MyJsonString())
|
||||||
|
.put(2);
|
||||||
|
assertTrue(ja1.similar(ja2));
|
||||||
|
|
||||||
|
JSONArray ja3 = new JSONArray()
|
||||||
|
.put(new JSONString() {
|
||||||
|
@Override
|
||||||
|
public String toJSONString() {
|
||||||
|
return "\"different value\"";
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.put(2);
|
||||||
|
assertFalse(ja1.similar(ja3));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,27 +1,7 @@
|
|||||||
package org.json.junit;
|
package org.json.junit;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2020 JSON.org
|
Public Domain.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import static org.junit.Assert.*;
|
import static org.junit.Assert.*;
|
||||||
@@ -853,4 +833,128 @@ public class JSONMLTest {
|
|||||||
ex.getMessage());
|
ex.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testToJSONArrayMaxNestingDepthOf42IsRespected() {
|
||||||
|
final String wayTooLongMalformedXML = new String(new char[6000]).replace("\0", "<a>");
|
||||||
|
|
||||||
|
final int maxNestingDepth = 42;
|
||||||
|
|
||||||
|
try {
|
||||||
|
JSONML.toJSONArray(wayTooLongMalformedXML, JSONMLParserConfiguration.ORIGINAL.withMaxNestingDepth(maxNestingDepth));
|
||||||
|
|
||||||
|
fail("Expecting a JSONException");
|
||||||
|
} catch (JSONException e) {
|
||||||
|
assertTrue("Wrong throwable thrown: not expecting message <" + e.getMessage() + ">",
|
||||||
|
e.getMessage().startsWith("Maximum nesting depth of " + maxNestingDepth));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testToJSONArrayMaxNestingDepthIsRespectedWithValidXML() {
|
||||||
|
final String perfectlyFineXML = "<Test>\n" +
|
||||||
|
" <employee>\n" +
|
||||||
|
" <name>sonoo</name>\n" +
|
||||||
|
" <salary>56000</salary>\n" +
|
||||||
|
" <married>true</married>\n" +
|
||||||
|
" </employee>\n" +
|
||||||
|
"</Test>\n";
|
||||||
|
|
||||||
|
final int maxNestingDepth = 1;
|
||||||
|
|
||||||
|
try {
|
||||||
|
JSONML.toJSONArray(perfectlyFineXML, JSONMLParserConfiguration.ORIGINAL.withMaxNestingDepth(maxNestingDepth));
|
||||||
|
|
||||||
|
fail("Expecting a JSONException");
|
||||||
|
} catch (JSONException e) {
|
||||||
|
assertTrue("Wrong throwable thrown: not expecting message <" + e.getMessage() + ">",
|
||||||
|
e.getMessage().startsWith("Maximum nesting depth of " + maxNestingDepth));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testToJSONArrayMaxNestingDepthWithValidFittingXML() {
|
||||||
|
final String perfectlyFineXML = "<Test>\n" +
|
||||||
|
" <employee>\n" +
|
||||||
|
" <name>sonoo</name>\n" +
|
||||||
|
" <salary>56000</salary>\n" +
|
||||||
|
" <married>true</married>\n" +
|
||||||
|
" </employee>\n" +
|
||||||
|
"</Test>\n";
|
||||||
|
|
||||||
|
final int maxNestingDepth = 3;
|
||||||
|
|
||||||
|
try {
|
||||||
|
JSONML.toJSONArray(perfectlyFineXML, JSONMLParserConfiguration.ORIGINAL.withMaxNestingDepth(maxNestingDepth));
|
||||||
|
} catch (JSONException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
fail("XML document should be parsed as its maximum depth fits the maxNestingDepth " +
|
||||||
|
"parameter of the JSONMLParserConfiguration used");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testToJSONObjectMaxNestingDepthOf42IsRespected() {
|
||||||
|
final String wayTooLongMalformedXML = new String(new char[6000]).replace("\0", "<a>");
|
||||||
|
|
||||||
|
final int maxNestingDepth = 42;
|
||||||
|
|
||||||
|
try {
|
||||||
|
JSONML.toJSONObject(wayTooLongMalformedXML, JSONMLParserConfiguration.ORIGINAL.withMaxNestingDepth(maxNestingDepth));
|
||||||
|
|
||||||
|
fail("Expecting a JSONException");
|
||||||
|
} catch (JSONException e) {
|
||||||
|
assertTrue("Wrong throwable thrown: not expecting message <" + e.getMessage() + ">",
|
||||||
|
e.getMessage().startsWith("Maximum nesting depth of " + maxNestingDepth));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testToJSONObjectMaxNestingDepthIsRespectedWithValidXML() {
|
||||||
|
final String perfectlyFineXML = "<Test>\n" +
|
||||||
|
" <employee>\n" +
|
||||||
|
" <name>sonoo</name>\n" +
|
||||||
|
" <salary>56000</salary>\n" +
|
||||||
|
" <married>true</married>\n" +
|
||||||
|
" </employee>\n" +
|
||||||
|
"</Test>\n";
|
||||||
|
|
||||||
|
final int maxNestingDepth = 1;
|
||||||
|
|
||||||
|
try {
|
||||||
|
JSONML.toJSONObject(perfectlyFineXML, JSONMLParserConfiguration.ORIGINAL.withMaxNestingDepth(maxNestingDepth));
|
||||||
|
|
||||||
|
fail("Expecting a JSONException");
|
||||||
|
} catch (JSONException e) {
|
||||||
|
assertTrue("Wrong throwable thrown: not expecting message <" + e.getMessage() + ">",
|
||||||
|
e.getMessage().startsWith("Maximum nesting depth of " + maxNestingDepth));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testToJSONObjectMaxNestingDepthWithValidFittingXML() {
|
||||||
|
final String perfectlyFineXML = "<Test>\n" +
|
||||||
|
" <employee>\n" +
|
||||||
|
" <name>sonoo</name>\n" +
|
||||||
|
" <salary>56000</salary>\n" +
|
||||||
|
" <married>true</married>\n" +
|
||||||
|
" </employee>\n" +
|
||||||
|
"</Test>\n";
|
||||||
|
|
||||||
|
final int maxNestingDepth = 3;
|
||||||
|
|
||||||
|
try {
|
||||||
|
JSONML.toJSONObject(perfectlyFineXML, JSONMLParserConfiguration.ORIGINAL.withMaxNestingDepth(maxNestingDepth));
|
||||||
|
} catch (JSONException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
fail("XML document should be parsed as its maximum depth fits the maxNestingDepth " +
|
||||||
|
"parameter of the JSONMLParserConfiguration used");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,27 +1,7 @@
|
|||||||
package org.json.junit;
|
package org.json.junit;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2020 JSON.org
|
Public Domain.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import static org.junit.Assert.*;
|
import static org.junit.Assert.*;
|
||||||
|
|||||||
126
src/test/java/org/json/junit/JSONObjectNumberTest.java
Normal file
126
src/test/java/org/json/junit/JSONObjectNumberTest.java
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
package org.json.junit;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.math.BigInteger;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
import org.json.JSONObject;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.junit.runners.Parameterized;
|
||||||
|
import org.junit.runners.Parameterized.Parameters;
|
||||||
|
|
||||||
|
@RunWith(value = Parameterized.class)
|
||||||
|
public class JSONObjectNumberTest {
|
||||||
|
private final String objectString;
|
||||||
|
private Integer value = 50;
|
||||||
|
|
||||||
|
@Parameters(name = "{index}: {0}")
|
||||||
|
public static Collection<Object[]> data() {
|
||||||
|
return Arrays.asList(new Object[][]{
|
||||||
|
{"{value:50}", 1},
|
||||||
|
{"{value:50.0}", 1},
|
||||||
|
{"{value:5e1}", 1},
|
||||||
|
{"{value:5E1}", 1},
|
||||||
|
{"{value:5e1}", 1},
|
||||||
|
{"{value:'50'}", 1},
|
||||||
|
{"{value:-50}", -1},
|
||||||
|
{"{value:-50.0}", -1},
|
||||||
|
{"{value:-5e1}", -1},
|
||||||
|
{"{value:-5E1}", -1},
|
||||||
|
{"{value:-5e1}", -1},
|
||||||
|
{"{value:'-50'}", -1}
|
||||||
|
// JSON does not support octal or hex numbers;
|
||||||
|
// see https://stackoverflow.com/a/52671839/6323312
|
||||||
|
// "{value:062}", // octal 50
|
||||||
|
// "{value:0x32}" // hex 50
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public JSONObjectNumberTest(String objectString, int resultIsNegative) {
|
||||||
|
this.objectString = objectString;
|
||||||
|
this.value *= resultIsNegative;
|
||||||
|
}
|
||||||
|
|
||||||
|
private JSONObject object;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setJsonObject() {
|
||||||
|
object = new JSONObject(objectString);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetNumber() {
|
||||||
|
assertEquals(value.intValue(), object.getNumber("value").intValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetBigDecimal() {
|
||||||
|
assertTrue(BigDecimal.valueOf(value).compareTo(object.getBigDecimal("value")) == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetBigInteger() {
|
||||||
|
assertEquals(BigInteger.valueOf(value), object.getBigInteger("value"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetFloat() {
|
||||||
|
assertEquals(value.floatValue(), object.getFloat("value"), 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetDouble() {
|
||||||
|
assertEquals(value.doubleValue(), object.getDouble("value"), 0.0d);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetInt() {
|
||||||
|
assertEquals(value.intValue(), object.getInt("value"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetLong() {
|
||||||
|
assertEquals(value.longValue(), object.getLong("value"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOptNumber() {
|
||||||
|
assertEquals(value.intValue(), object.optNumber("value").intValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOptBigDecimal() {
|
||||||
|
assertTrue(BigDecimal.valueOf(value).compareTo(object.optBigDecimal("value", null)) == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOptBigInteger() {
|
||||||
|
assertEquals(BigInteger.valueOf(value), object.optBigInteger("value", null));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOptFloat() {
|
||||||
|
assertEquals(value.floatValue(), object.optFloat("value"), 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOptDouble() {
|
||||||
|
assertEquals(value.doubleValue(), object.optDouble("value"), 0.0d);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOptInt() {
|
||||||
|
assertEquals(value.intValue(), object.optInt("value"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOptLong() {
|
||||||
|
assertEquals(value.longValue(), object.optLong("value"));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,27 +1,7 @@
|
|||||||
package org.json.junit;
|
package org.json.junit;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2020 JSON.org
|
Public Domain.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
@@ -41,14 +21,7 @@ import java.io.StringReader;
|
|||||||
import java.io.StringWriter;
|
import java.io.StringWriter;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.math.BigInteger;
|
import java.math.BigInteger;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Locale;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
@@ -57,6 +30,7 @@ import org.json.JSONArray;
|
|||||||
import org.json.JSONException;
|
import org.json.JSONException;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
import org.json.JSONPointerException;
|
import org.json.JSONPointerException;
|
||||||
|
import org.json.JSONString;
|
||||||
import org.json.JSONTokener;
|
import org.json.JSONTokener;
|
||||||
import org.json.XML;
|
import org.json.XML;
|
||||||
import org.json.junit.data.BrokenToString;
|
import org.json.junit.data.BrokenToString;
|
||||||
@@ -80,6 +54,7 @@ import org.json.junit.data.Singleton;
|
|||||||
import org.json.junit.data.SingletonEnum;
|
import org.json.junit.data.SingletonEnum;
|
||||||
import org.json.junit.data.WeirdList;
|
import org.json.junit.data.WeirdList;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
import org.json.junit.Util;
|
||||||
|
|
||||||
import com.jayway.jsonpath.Configuration;
|
import com.jayway.jsonpath.Configuration;
|
||||||
import com.jayway.jsonpath.JsonPath;
|
import com.jayway.jsonpath.JsonPath;
|
||||||
@@ -140,6 +115,10 @@ public class JSONObjectTest {
|
|||||||
JSONObject first = new JSONObject("{\"a\": 1, \"b\": 2, \"c\": 3}");
|
JSONObject first = new JSONObject("{\"a\": 1, \"b\": 2, \"c\": 3}");
|
||||||
JSONObject second = new JSONObject("{\"a\": 1, \"b\": 2.0, \"c\": 4}");
|
JSONObject second = new JSONObject("{\"a\": 1, \"b\": 2.0, \"c\": 4}");
|
||||||
assertFalse("first-second should eval to false", first.similar(second));
|
assertFalse("first-second should eval to false", first.similar(second));
|
||||||
|
List<JSONObject> jsonObjects = new ArrayList<JSONObject>(
|
||||||
|
Arrays.asList(obj1, obj2, obj3, obj4, obj5)
|
||||||
|
);
|
||||||
|
Util.checkJSONObjectsMaps(jsonObjects);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -214,7 +193,9 @@ public class JSONObjectTest {
|
|||||||
*/
|
*/
|
||||||
@Test(expected=NullPointerException.class)
|
@Test(expected=NullPointerException.class)
|
||||||
public void jsonObjectByNullBean() {
|
public void jsonObjectByNullBean() {
|
||||||
assertNull("Expected an exception",new JSONObject((MyBean)null));
|
JSONObject jsonObject = new JSONObject((MyBean)null);
|
||||||
|
assertNull("Expected an exception", jsonObject);
|
||||||
|
Util.checkJSONObjectMaps(jsonObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -232,6 +213,7 @@ public class JSONObjectTest {
|
|||||||
assertTrue("expected value1", textStr.contains("\"value1\""));
|
assertTrue("expected value1", textStr.contains("\"value1\""));
|
||||||
assertTrue("expected key2", textStr.contains("\"key2\""));
|
assertTrue("expected key2", textStr.contains("\"key2\""));
|
||||||
assertTrue("expected 42", textStr.contains("42"));
|
assertTrue("expected 42", textStr.contains("42"));
|
||||||
|
Util.checkJSONObjectMaps(jsonObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -252,6 +234,7 @@ public class JSONObjectTest {
|
|||||||
final String actualString = json.optString("key");
|
final String actualString = json.optString("key");
|
||||||
assert str.equals(actualString) : "Incorrect key value. Got "
|
assert str.equals(actualString) : "Incorrect key value. Got "
|
||||||
+ actualString + " expected " + str;
|
+ actualString + " expected " + str;
|
||||||
|
Util.checkJSONObjectMaps(json);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -261,6 +244,7 @@ public class JSONObjectTest {
|
|||||||
public void emptyJsonObject() {
|
public void emptyJsonObject() {
|
||||||
JSONObject jsonObject = new JSONObject();
|
JSONObject jsonObject = new JSONObject();
|
||||||
assertTrue("jsonObject should be empty", jsonObject.isEmpty());
|
assertTrue("jsonObject should be empty", jsonObject.isEmpty());
|
||||||
|
Util.checkJSONObjectMaps(jsonObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -291,6 +275,7 @@ public class JSONObjectTest {
|
|||||||
assertTrue("expected \"nullKey\":null", JSONObject.NULL.equals(jsonObjectByName.query("/nullKey")));
|
assertTrue("expected \"nullKey\":null", JSONObject.NULL.equals(jsonObjectByName.query("/nullKey")));
|
||||||
assertTrue("expected \"stringKey\":\"hello world!\"", "hello world!".equals(jsonObjectByName.query("/stringKey")));
|
assertTrue("expected \"stringKey\":\"hello world!\"", "hello world!".equals(jsonObjectByName.query("/stringKey")));
|
||||||
assertTrue("expected \"doubleKey\":-23.45e67", new BigDecimal("-23.45e67").equals(jsonObjectByName.query("/doubleKey")));
|
assertTrue("expected \"doubleKey\":-23.45e67", new BigDecimal("-23.45e67").equals(jsonObjectByName.query("/doubleKey")));
|
||||||
|
Util.checkJSONObjectsMaps(new ArrayList<JSONObject>(Arrays.asList(jsonObject, jsonObjectByName)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -304,6 +289,7 @@ public class JSONObjectTest {
|
|||||||
Map<String, Object> map = null;
|
Map<String, Object> map = null;
|
||||||
JSONObject jsonObject = new JSONObject(map);
|
JSONObject jsonObject = new JSONObject(map);
|
||||||
assertTrue("jsonObject should be empty", jsonObject.isEmpty());
|
assertTrue("jsonObject should be empty", jsonObject.isEmpty());
|
||||||
|
Util.checkJSONObjectMaps(jsonObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -329,6 +315,7 @@ public class JSONObjectTest {
|
|||||||
assertTrue("expected \"stringKey\":\"hello world!\"", "hello world!".equals(jsonObject.query("/stringKey")));
|
assertTrue("expected \"stringKey\":\"hello world!\"", "hello world!".equals(jsonObject.query("/stringKey")));
|
||||||
assertTrue("expected \"escapeStringKey\":\"h\be\tllo w\u1234orld!\"", "h\be\tllo w\u1234orld!".equals(jsonObject.query("/escapeStringKey")));
|
assertTrue("expected \"escapeStringKey\":\"h\be\tllo w\u1234orld!\"", "h\be\tllo w\u1234orld!".equals(jsonObject.query("/escapeStringKey")));
|
||||||
assertTrue("expected \"doubleKey\":-23.45e67", Double.valueOf("-23.45e67").equals(jsonObject.query("/doubleKey")));
|
assertTrue("expected \"doubleKey\":-23.45e67", Double.valueOf("-23.45e67").equals(jsonObject.query("/doubleKey")));
|
||||||
|
Util.checkJSONObjectMaps(jsonObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -367,6 +354,9 @@ public class JSONObjectTest {
|
|||||||
assertTrue(
|
assertTrue(
|
||||||
"The RAW Collection should give me the same as the Typed Collection",
|
"The RAW Collection should give me the same as the Typed Collection",
|
||||||
expected.similar(jaObjObj));
|
expected.similar(jaObjObj));
|
||||||
|
Util.checkJSONObjectsMaps(new ArrayList<JSONObject>(
|
||||||
|
Arrays.asList(jaRaw, jaStrObj, jaStrInt, jaObjObj))
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -384,8 +374,8 @@ public class JSONObjectTest {
|
|||||||
* The only getter is getNumber (key=number), whose return value is
|
* The only getter is getNumber (key=number), whose return value is
|
||||||
* BigDecimal(42).
|
* BigDecimal(42).
|
||||||
*/
|
*/
|
||||||
JSONObject jsonObject = new JSONObject(new MyNumberContainer());
|
JSONObject jsonObject0 = new JSONObject(new MyNumberContainer());
|
||||||
String actual = jsonObject.toString();
|
String actual = jsonObject0.toString();
|
||||||
String expected = "{\"myNumber\":{\"number\":42}}";
|
String expected = "{\"myNumber\":{\"number\":42}}";
|
||||||
assertEquals("Equal", expected , actual);
|
assertEquals("Equal", expected , actual);
|
||||||
|
|
||||||
@@ -397,9 +387,9 @@ public class JSONObjectTest {
|
|||||||
* The MyNumber.toString() method is responsible for
|
* The MyNumber.toString() method is responsible for
|
||||||
* returning a reasonable value: the string '42'.
|
* returning a reasonable value: the string '42'.
|
||||||
*/
|
*/
|
||||||
jsonObject = new JSONObject();
|
JSONObject jsonObject1 = new JSONObject();
|
||||||
jsonObject.put("myNumber", new MyNumber());
|
jsonObject1.put("myNumber", new MyNumber());
|
||||||
actual = jsonObject.toString();
|
actual = jsonObject1.toString();
|
||||||
expected = "{\"myNumber\":42}";
|
expected = "{\"myNumber\":42}";
|
||||||
assertEquals("Equal", expected , actual);
|
assertEquals("Equal", expected , actual);
|
||||||
|
|
||||||
@@ -411,8 +401,8 @@ public class JSONObjectTest {
|
|||||||
* wrap() inserts the value as a string. That is why 42 comes back
|
* wrap() inserts the value as a string. That is why 42 comes back
|
||||||
* wrapped in quotes.
|
* wrapped in quotes.
|
||||||
*/
|
*/
|
||||||
jsonObject = new JSONObject(Collections.singletonMap("myNumber", new AtomicInteger(42)));
|
JSONObject jsonObject2 = new JSONObject(Collections.singletonMap("myNumber", new AtomicInteger(42)));
|
||||||
actual = jsonObject.toString();
|
actual = jsonObject2.toString();
|
||||||
expected = "{\"myNumber\":\"42\"}";
|
expected = "{\"myNumber\":\"42\"}";
|
||||||
assertEquals("Equal", expected , actual);
|
assertEquals("Equal", expected , actual);
|
||||||
|
|
||||||
@@ -422,9 +412,9 @@ public class JSONObjectTest {
|
|||||||
* AtomicInteger is recognized as a Number, and converted via
|
* AtomicInteger is recognized as a Number, and converted via
|
||||||
* numberToString() into the unquoted string '42'.
|
* numberToString() into the unquoted string '42'.
|
||||||
*/
|
*/
|
||||||
jsonObject = new JSONObject();
|
JSONObject jsonObject3 = new JSONObject();
|
||||||
jsonObject.put("myNumber", new AtomicInteger(42));
|
jsonObject3.put("myNumber", new AtomicInteger(42));
|
||||||
actual = jsonObject.toString();
|
actual = jsonObject3.toString();
|
||||||
expected = "{\"myNumber\":42}";
|
expected = "{\"myNumber\":42}";
|
||||||
assertEquals("Equal", expected , actual);
|
assertEquals("Equal", expected , actual);
|
||||||
|
|
||||||
@@ -435,11 +425,11 @@ public class JSONObjectTest {
|
|||||||
* bean and inserted into a contained JSONObject. It has 2 getters,
|
* bean and inserted into a contained JSONObject. It has 2 getters,
|
||||||
* for numerator and denominator.
|
* for numerator and denominator.
|
||||||
*/
|
*/
|
||||||
jsonObject = new JSONObject(Collections.singletonMap("myNumber", new Fraction(4,2)));
|
JSONObject jsonObject4 = new JSONObject(Collections.singletonMap("myNumber", new Fraction(4,2)));
|
||||||
assertEquals(1, jsonObject.length());
|
assertEquals(1, jsonObject4.length());
|
||||||
assertEquals(2, ((JSONObject)(jsonObject.get("myNumber"))).length());
|
assertEquals(2, ((JSONObject)(jsonObject4.get("myNumber"))).length());
|
||||||
assertEquals("Numerator", BigInteger.valueOf(4) , jsonObject.query("/myNumber/numerator"));
|
assertEquals("Numerator", BigInteger.valueOf(4) , jsonObject4.query("/myNumber/numerator"));
|
||||||
assertEquals("Denominator", BigInteger.valueOf(2) , jsonObject.query("/myNumber/denominator"));
|
assertEquals("Denominator", BigInteger.valueOf(2) , jsonObject4.query("/myNumber/denominator"));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* JSONObject.put() inserts the Fraction directly into the
|
* JSONObject.put() inserts the Fraction directly into the
|
||||||
@@ -449,11 +439,15 @@ public class JSONObjectTest {
|
|||||||
* BigDecimal sanity check fails, so writeValue() defaults
|
* BigDecimal sanity check fails, so writeValue() defaults
|
||||||
* to returning a safe JSON quoted string. Pretty slick!
|
* to returning a safe JSON quoted string. Pretty slick!
|
||||||
*/
|
*/
|
||||||
jsonObject = new JSONObject();
|
JSONObject jsonObject5 = new JSONObject();
|
||||||
jsonObject.put("myNumber", new Fraction(4,2));
|
jsonObject5.put("myNumber", new Fraction(4,2));
|
||||||
actual = jsonObject.toString();
|
actual = jsonObject5.toString();
|
||||||
expected = "{\"myNumber\":\"4/2\"}"; // valid JSON, bug fixed
|
expected = "{\"myNumber\":\"4/2\"}"; // valid JSON, bug fixed
|
||||||
assertEquals("Equal", expected , actual);
|
assertEquals("Equal", expected , actual);
|
||||||
|
|
||||||
|
Util.checkJSONObjectsMaps(new ArrayList<JSONObject>(Arrays.asList(
|
||||||
|
jsonObject0, jsonObject1, jsonObject2, jsonObject3, jsonObject4, jsonObject5
|
||||||
|
)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -488,6 +482,10 @@ public class JSONObjectTest {
|
|||||||
assertTrue(
|
assertTrue(
|
||||||
"The RAW Collection should give me the same as the Typed Collection",
|
"The RAW Collection should give me the same as the Typed Collection",
|
||||||
expected.similar(jaInt));
|
expected.similar(jaInt));
|
||||||
|
|
||||||
|
Util.checkJSONObjectsMaps(new ArrayList<JSONObject>(Arrays.asList(
|
||||||
|
jaRaw, jaObj, jaInt
|
||||||
|
)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -531,6 +529,10 @@ public class JSONObjectTest {
|
|||||||
assertTrue(
|
assertTrue(
|
||||||
"The RAW Collection should give me the same as the Typed Collection",
|
"The RAW Collection should give me the same as the Typed Collection",
|
||||||
expected.similar(jaObjObj));
|
expected.similar(jaObjObj));
|
||||||
|
|
||||||
|
Util.checkJSONObjectsMaps(new ArrayList<JSONObject>(Arrays.asList(
|
||||||
|
jaRaw, jaStrObj, jaStrInt, jaStrObj
|
||||||
|
)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -553,6 +555,7 @@ public class JSONObjectTest {
|
|||||||
assertTrue("expected 2 top level items", ((Map<?,?>)(JsonPath.read(doc, "$"))).size() == 2);
|
assertTrue("expected 2 top level items", ((Map<?,?>)(JsonPath.read(doc, "$"))).size() == 2);
|
||||||
assertTrue("expected 0 key1 items", ((Map<?,?>)(JsonPath.read(doc, "$.key1"))).size() == 0);
|
assertTrue("expected 0 key1 items", ((Map<?,?>)(JsonPath.read(doc, "$.key1"))).size() == 0);
|
||||||
assertTrue("expected \"key2\":java.lang.Exception","java.lang.Exception".equals(jsonObject.query("/key2")));
|
assertTrue("expected \"key2\":java.lang.Exception","java.lang.Exception".equals(jsonObject.query("/key2")));
|
||||||
|
Util.checkJSONObjectMaps(jsonObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -580,6 +583,7 @@ public class JSONObjectTest {
|
|||||||
assertTrue("expected \"escapeStringKey\":\"h\be\tllo w\u1234orld!\"", "h\be\tllo w\u1234orld!".equals(jsonObject.query("/escapeStringKey")));
|
assertTrue("expected \"escapeStringKey\":\"h\be\tllo w\u1234orld!\"", "h\be\tllo w\u1234orld!".equals(jsonObject.query("/escapeStringKey")));
|
||||||
assertTrue("expected \"intKey\":42", Long.valueOf("42").equals(jsonObject.query("/intKey")));
|
assertTrue("expected \"intKey\":42", Long.valueOf("42").equals(jsonObject.query("/intKey")));
|
||||||
assertTrue("expected \"doubleKey\":-23.45e67", Double.valueOf("-23.45e67").equals(jsonObject.query("/doubleKey")));
|
assertTrue("expected \"doubleKey\":-23.45e67", Double.valueOf("-23.45e67").equals(jsonObject.query("/doubleKey")));
|
||||||
|
Util.checkJSONObjectMaps(jsonObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -620,6 +624,7 @@ public class JSONObjectTest {
|
|||||||
assertTrue("expected 2 callbacks items", ((List<?>)(JsonPath.read(doc, "$.callbacks"))).size() == 2);
|
assertTrue("expected 2 callbacks items", ((List<?>)(JsonPath.read(doc, "$.callbacks"))).size() == 2);
|
||||||
assertTrue("expected 0 handler items", ((Map<?,?>)(JsonPath.read(doc, "$.callbacks[0].handler"))).size() == 0);
|
assertTrue("expected 0 handler items", ((Map<?,?>)(JsonPath.read(doc, "$.callbacks[0].handler"))).size() == 0);
|
||||||
assertTrue("expected 0 callbacks[1] items", ((Map<?,?>)(JsonPath.read(doc, "$.callbacks[1]"))).size() == 0);
|
assertTrue("expected 0 callbacks[1] items", ((Map<?,?>)(JsonPath.read(doc, "$.callbacks[1]"))).size() == 0);
|
||||||
|
Util.checkJSONObjectMaps(jsonObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -655,6 +660,7 @@ public class JSONObjectTest {
|
|||||||
// InterfaceField replaces someFloat property name via user-defined annotation
|
// InterfaceField replaces someFloat property name via user-defined annotation
|
||||||
assertTrue("Overridden String field name (InterfaceField) should have been found",
|
assertTrue("Overridden String field name (InterfaceField) should have been found",
|
||||||
jsonObject.has("InterfaceField"));
|
jsonObject.has("InterfaceField"));
|
||||||
|
Util.checkJSONObjectMaps(jsonObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -705,6 +711,7 @@ public class JSONObjectTest {
|
|||||||
// property name able was replaced by Getable via user-defined annotation
|
// property name able was replaced by Getable via user-defined annotation
|
||||||
assertTrue("Overridden boolean field name (Getable) should have been found",
|
assertTrue("Overridden boolean field name (Getable) should have been found",
|
||||||
jsonObject.has("Getable"));
|
jsonObject.has("Getable"));
|
||||||
|
Util.checkJSONObjectMaps(jsonObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -725,6 +732,7 @@ public class JSONObjectTest {
|
|||||||
assertTrue("expected 2 top level items", ((Map<?,?>)(JsonPath.read(doc, "$"))).size() == 2);
|
assertTrue("expected 2 top level items", ((Map<?,?>)(JsonPath.read(doc, "$"))).size() == 2);
|
||||||
assertTrue("expected \"publicString\":\"abc\"", "abc".equals(jsonObject.query("/publicString")));
|
assertTrue("expected \"publicString\":\"abc\"", "abc".equals(jsonObject.query("/publicString")));
|
||||||
assertTrue("expected \"publicInt\":42", Integer.valueOf(42).equals(jsonObject.query("/publicInt")));
|
assertTrue("expected \"publicInt\":42", Integer.valueOf(42).equals(jsonObject.query("/publicInt")));
|
||||||
|
Util.checkJSONObjectMaps(jsonObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -746,6 +754,7 @@ public class JSONObjectTest {
|
|||||||
assertTrue("expected 2 farewells items", ((Map<?,?>)(JsonPath.read(doc, "$.farewells"))).size() == 2);
|
assertTrue("expected 2 farewells items", ((Map<?,?>)(JsonPath.read(doc, "$.farewells"))).size() == 2);
|
||||||
assertTrue("expected \"later\":\"Later, \"", "Later, ".equals(jsonObject.query("/farewells/later")));
|
assertTrue("expected \"later\":\"Later, \"", "Later, ".equals(jsonObject.query("/farewells/later")));
|
||||||
assertTrue("expected \"world\":\"World!\"", "Alligator!".equals(jsonObject.query("/farewells/gator")));
|
assertTrue("expected \"world\":\"World!\"", "Alligator!".equals(jsonObject.query("/farewells/gator")));
|
||||||
|
Util.checkJSONObjectMaps(jsonObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -778,6 +787,7 @@ public class JSONObjectTest {
|
|||||||
assertTrue("expected h\be\tllo w\u1234orld!", "h\be\tllo w\u1234orld!".equals(jsonObject.query("/myArray/3")));
|
assertTrue("expected h\be\tllo w\u1234orld!", "h\be\tllo w\u1234orld!".equals(jsonObject.query("/myArray/3")));
|
||||||
assertTrue("expected 42", Integer.valueOf(42).equals(jsonObject.query("/myArray/4")));
|
assertTrue("expected 42", Integer.valueOf(42).equals(jsonObject.query("/myArray/4")));
|
||||||
assertTrue("expected -23.45e7", Double.valueOf(-23.45e7).equals(jsonObject.query("/myArray/5")));
|
assertTrue("expected -23.45e7", Double.valueOf(-23.45e7).equals(jsonObject.query("/myArray/5")));
|
||||||
|
Util.checkJSONObjectMaps(jsonObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -809,6 +819,7 @@ public class JSONObjectTest {
|
|||||||
assertTrue("expected h\be\tllo w\u1234orld!", "h\be\tllo w\u1234orld!".equals(jsonObject.query("/myArray/3")));
|
assertTrue("expected h\be\tllo w\u1234orld!", "h\be\tllo w\u1234orld!".equals(jsonObject.query("/myArray/3")));
|
||||||
assertTrue("expected 42", Integer.valueOf(42).equals(jsonObject.query("/myArray/4")));
|
assertTrue("expected 42", Integer.valueOf(42).equals(jsonObject.query("/myArray/4")));
|
||||||
assertTrue("expected -23.45e7", Double.valueOf(-23.45e7).equals(jsonObject.query("/myArray/5")));
|
assertTrue("expected -23.45e7", Double.valueOf(-23.45e7).equals(jsonObject.query("/myArray/5")));
|
||||||
|
Util.checkJSONObjectMaps(jsonObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -944,6 +955,7 @@ public class JSONObjectTest {
|
|||||||
JSONObject jsonObjectInner = jsonObject.getJSONObject("objectKey");
|
JSONObject jsonObjectInner = jsonObject.getJSONObject("objectKey");
|
||||||
assertTrue("objectKey should be JSONObject",
|
assertTrue("objectKey should be JSONObject",
|
||||||
jsonObjectInner.get("myKey").equals("myVal"));
|
jsonObjectInner.get("myKey").equals("myVal"));
|
||||||
|
Util.checkJSONObjectMaps(jsonObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1006,6 +1018,7 @@ public class JSONObjectTest {
|
|||||||
obj = jsonObject.get( "largeExponent" );
|
obj = jsonObject.get( "largeExponent" );
|
||||||
assertTrue("largeExponent should evaluate as a BigDecimal",
|
assertTrue("largeExponent should evaluate as a BigDecimal",
|
||||||
new BigDecimal("-23.45e2327").equals(obj));
|
new BigDecimal("-23.45e2327").equals(obj));
|
||||||
|
Util.checkJSONObjectMaps(jsonObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1054,6 +1067,7 @@ public class JSONObjectTest {
|
|||||||
jsonObject.get("floatIdentifier").equals(Double.valueOf(0.1)));
|
jsonObject.get("floatIdentifier").equals(Double.valueOf(0.1)));
|
||||||
assertTrue("doubleIdentifier currently evaluates to double 0.1",
|
assertTrue("doubleIdentifier currently evaluates to double 0.1",
|
||||||
jsonObject.get("doubleIdentifier").equals(Double.valueOf(0.1)));
|
jsonObject.get("doubleIdentifier").equals(Double.valueOf(0.1)));
|
||||||
|
Util.checkJSONObjectMaps(jsonObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1205,6 +1219,7 @@ public class JSONObjectTest {
|
|||||||
"JSONObject[\"stringKey\"] is not a JSONObject (class java.lang.String : hello world!).",
|
"JSONObject[\"stringKey\"] is not a JSONObject (class java.lang.String : hello world!).",
|
||||||
e.getMessage());
|
e.getMessage());
|
||||||
}
|
}
|
||||||
|
Util.checkJSONObjectMaps(jsonObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1232,6 +1247,7 @@ public class JSONObjectTest {
|
|||||||
assertTrue("3.0 can still be interpreted as a double",
|
assertTrue("3.0 can still be interpreted as a double",
|
||||||
deserialized.getDouble(key30) == 3.0);
|
deserialized.getDouble(key30) == 3.0);
|
||||||
assertTrue("3.1 remains a double", deserialized.getDouble(key31) == 3.1);
|
assertTrue("3.1 remains a double", deserialized.getDouble(key31) == 3.1);
|
||||||
|
Util.checkJSONObjectMaps(jsonObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1247,9 +1263,9 @@ public class JSONObjectTest {
|
|||||||
* value is stored. This should be fixed.
|
* value is stored. This should be fixed.
|
||||||
*/
|
*/
|
||||||
BigInteger bigInteger = new BigInteger("123456789012345678901234567890");
|
BigInteger bigInteger = new BigInteger("123456789012345678901234567890");
|
||||||
JSONObject jsonObject = new JSONObject(bigInteger);
|
JSONObject jsonObject0 = new JSONObject(bigInteger);
|
||||||
Object obj = jsonObject.get("lowestSetBit");
|
Object obj = jsonObject0.get("lowestSetBit");
|
||||||
assertTrue("JSONObject only has 1 value", jsonObject.length() == 1);
|
assertTrue("JSONObject only has 1 value", jsonObject0.length() == 1);
|
||||||
assertTrue("JSONObject parses BigInteger as the Integer lowestBitSet",
|
assertTrue("JSONObject parses BigInteger as the Integer lowestBitSet",
|
||||||
obj instanceof Integer);
|
obj instanceof Integer);
|
||||||
assertTrue("this bigInteger lowestBitSet happens to be 1",
|
assertTrue("this bigInteger lowestBitSet happens to be 1",
|
||||||
@@ -1262,57 +1278,57 @@ public class JSONObjectTest {
|
|||||||
*/
|
*/
|
||||||
BigDecimal bigDecimal = new BigDecimal(
|
BigDecimal bigDecimal = new BigDecimal(
|
||||||
"123456789012345678901234567890.12345678901234567890123456789");
|
"123456789012345678901234567890.12345678901234567890123456789");
|
||||||
jsonObject = new JSONObject(bigDecimal);
|
JSONObject jsonObject1 = new JSONObject(bigDecimal);
|
||||||
assertTrue("large bigDecimal is not stored", jsonObject.isEmpty());
|
assertTrue("large bigDecimal is not stored", jsonObject1.isEmpty());
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* JSONObject put(String, Object) method stores and serializes
|
* JSONObject put(String, Object) method stores and serializes
|
||||||
* bigInt and bigDec correctly. Nothing needs to change.
|
* bigInt and bigDec correctly. Nothing needs to change.
|
||||||
*/
|
*/
|
||||||
jsonObject = new JSONObject();
|
JSONObject jsonObject2 = new JSONObject();
|
||||||
jsonObject.put("bigInt", bigInteger);
|
jsonObject2.put("bigInt", bigInteger);
|
||||||
assertTrue("jsonObject.put() handles bigInt correctly",
|
assertTrue("jsonObject.put() handles bigInt correctly",
|
||||||
jsonObject.get("bigInt").equals(bigInteger));
|
jsonObject2.get("bigInt").equals(bigInteger));
|
||||||
assertTrue("jsonObject.getBigInteger() handles bigInt correctly",
|
assertTrue("jsonObject.getBigInteger() handles bigInt correctly",
|
||||||
jsonObject.getBigInteger("bigInt").equals(bigInteger));
|
jsonObject2.getBigInteger("bigInt").equals(bigInteger));
|
||||||
assertTrue("jsonObject.optBigInteger() handles bigInt correctly",
|
assertTrue("jsonObject.optBigInteger() handles bigInt correctly",
|
||||||
jsonObject.optBigInteger("bigInt", BigInteger.ONE).equals(bigInteger));
|
jsonObject2.optBigInteger("bigInt", BigInteger.ONE).equals(bigInteger));
|
||||||
assertTrue("jsonObject serializes bigInt correctly",
|
assertTrue("jsonObject serializes bigInt correctly",
|
||||||
jsonObject.toString().equals("{\"bigInt\":123456789012345678901234567890}"));
|
jsonObject2.toString().equals("{\"bigInt\":123456789012345678901234567890}"));
|
||||||
assertTrue("BigInteger as BigDecimal",
|
assertTrue("BigInteger as BigDecimal",
|
||||||
jsonObject.getBigDecimal("bigInt").equals(new BigDecimal(bigInteger)));
|
jsonObject2.getBigDecimal("bigInt").equals(new BigDecimal(bigInteger)));
|
||||||
|
|
||||||
|
|
||||||
jsonObject = new JSONObject();
|
JSONObject jsonObject3 = new JSONObject();
|
||||||
jsonObject.put("bigDec", bigDecimal);
|
jsonObject3.put("bigDec", bigDecimal);
|
||||||
assertTrue("jsonObject.put() handles bigDec correctly",
|
assertTrue("jsonObject.put() handles bigDec correctly",
|
||||||
jsonObject.get("bigDec").equals(bigDecimal));
|
jsonObject3.get("bigDec").equals(bigDecimal));
|
||||||
assertTrue("jsonObject.getBigDecimal() handles bigDec correctly",
|
assertTrue("jsonObject.getBigDecimal() handles bigDec correctly",
|
||||||
jsonObject.getBigDecimal("bigDec").equals(bigDecimal));
|
jsonObject3.getBigDecimal("bigDec").equals(bigDecimal));
|
||||||
assertTrue("jsonObject.optBigDecimal() handles bigDec correctly",
|
assertTrue("jsonObject.optBigDecimal() handles bigDec correctly",
|
||||||
jsonObject.optBigDecimal("bigDec", BigDecimal.ONE).equals(bigDecimal));
|
jsonObject3.optBigDecimal("bigDec", BigDecimal.ONE).equals(bigDecimal));
|
||||||
assertTrue("jsonObject serializes bigDec correctly",
|
assertTrue("jsonObject serializes bigDec correctly",
|
||||||
jsonObject.toString().equals(
|
jsonObject3.toString().equals(
|
||||||
"{\"bigDec\":123456789012345678901234567890.12345678901234567890123456789}"));
|
"{\"bigDec\":123456789012345678901234567890.12345678901234567890123456789}"));
|
||||||
|
|
||||||
assertTrue("BigDecimal as BigInteger",
|
assertTrue("BigDecimal as BigInteger",
|
||||||
jsonObject.getBigInteger("bigDec").equals(bigDecimal.toBigInteger()));
|
jsonObject3.getBigInteger("bigDec").equals(bigDecimal.toBigInteger()));
|
||||||
/**
|
/**
|
||||||
* exercise some exceptions
|
* exercise some exceptions
|
||||||
*/
|
*/
|
||||||
try {
|
try {
|
||||||
// bigInt key does not exist
|
// bigInt key does not exist
|
||||||
jsonObject.getBigDecimal("bigInt");
|
jsonObject3.getBigDecimal("bigInt");
|
||||||
fail("expected an exeption");
|
fail("expected an exeption");
|
||||||
} catch (JSONException ignored) {}
|
} catch (JSONException ignored) {}
|
||||||
obj = jsonObject.optBigDecimal("bigInt", BigDecimal.ONE);
|
obj = jsonObject3.optBigDecimal("bigInt", BigDecimal.ONE);
|
||||||
assertTrue("expected BigDecimal", obj.equals(BigDecimal.ONE));
|
assertTrue("expected BigDecimal", obj.equals(BigDecimal.ONE));
|
||||||
jsonObject.put("stringKey", "abc");
|
jsonObject3.put("stringKey", "abc");
|
||||||
try {
|
try {
|
||||||
jsonObject.getBigDecimal("stringKey");
|
jsonObject3.getBigDecimal("stringKey");
|
||||||
fail("expected an exeption");
|
fail("expected an exeption");
|
||||||
} catch (JSONException ignored) {}
|
} catch (JSONException ignored) {}
|
||||||
obj = jsonObject.optBigInteger("bigDec", BigInteger.ONE);
|
obj = jsonObject3.optBigInteger("bigDec", BigInteger.ONE);
|
||||||
assertTrue("expected BigInteger", obj instanceof BigInteger);
|
assertTrue("expected BigInteger", obj instanceof BigInteger);
|
||||||
assertEquals(bigDecimal.toBigInteger(), obj);
|
assertEquals(bigDecimal.toBigInteger(), obj);
|
||||||
|
|
||||||
@@ -1345,79 +1361,79 @@ public class JSONObjectTest {
|
|||||||
// bigInt map ctor
|
// bigInt map ctor
|
||||||
Map<String, Object> map = new HashMap<String, Object>();
|
Map<String, Object> map = new HashMap<String, Object>();
|
||||||
map.put("bigInt", bigInteger);
|
map.put("bigInt", bigInteger);
|
||||||
jsonObject = new JSONObject(map);
|
JSONObject jsonObject4 = new JSONObject(map);
|
||||||
String actualFromMapStr = jsonObject.toString();
|
String actualFromMapStr = jsonObject4.toString();
|
||||||
assertTrue("bigInt in map (or array or bean) is a string",
|
assertTrue("bigInt in map (or array or bean) is a string",
|
||||||
actualFromMapStr.equals(
|
actualFromMapStr.equals(
|
||||||
"{\"bigInt\":123456789012345678901234567890}"));
|
"{\"bigInt\":123456789012345678901234567890}"));
|
||||||
// bigInt put
|
// bigInt put
|
||||||
jsonObject = new JSONObject();
|
JSONObject jsonObject5 = new JSONObject();
|
||||||
jsonObject.put("bigInt", bigInteger);
|
jsonObject5.put("bigInt", bigInteger);
|
||||||
String actualFromPutStr = jsonObject.toString();
|
String actualFromPutStr = jsonObject5.toString();
|
||||||
assertTrue("bigInt from put is a number",
|
assertTrue("bigInt from put is a number",
|
||||||
actualFromPutStr.equals(
|
actualFromPutStr.equals(
|
||||||
"{\"bigInt\":123456789012345678901234567890}"));
|
"{\"bigInt\":123456789012345678901234567890}"));
|
||||||
// bigDec map ctor
|
// bigDec map ctor
|
||||||
map = new HashMap<String, Object>();
|
map = new HashMap<String, Object>();
|
||||||
map.put("bigDec", bigDecimal);
|
map.put("bigDec", bigDecimal);
|
||||||
jsonObject = new JSONObject(map);
|
JSONObject jsonObject6 = new JSONObject(map);
|
||||||
actualFromMapStr = jsonObject.toString();
|
actualFromMapStr = jsonObject6.toString();
|
||||||
assertTrue("bigDec in map (or array or bean) is a bigDec",
|
assertTrue("bigDec in map (or array or bean) is a bigDec",
|
||||||
actualFromMapStr.equals(
|
actualFromMapStr.equals(
|
||||||
"{\"bigDec\":123456789012345678901234567890.12345678901234567890123456789}"));
|
"{\"bigDec\":123456789012345678901234567890.12345678901234567890123456789}"));
|
||||||
// bigDec put
|
// bigDec put
|
||||||
jsonObject = new JSONObject();
|
JSONObject jsonObject7 = new JSONObject();
|
||||||
jsonObject.put("bigDec", bigDecimal);
|
jsonObject7.put("bigDec", bigDecimal);
|
||||||
actualFromPutStr = jsonObject.toString();
|
actualFromPutStr = jsonObject7.toString();
|
||||||
assertTrue("bigDec from put is a number",
|
assertTrue("bigDec from put is a number",
|
||||||
actualFromPutStr.equals(
|
actualFromPutStr.equals(
|
||||||
"{\"bigDec\":123456789012345678901234567890.12345678901234567890123456789}"));
|
"{\"bigDec\":123456789012345678901234567890.12345678901234567890123456789}"));
|
||||||
// bigInt,bigDec put
|
// bigInt,bigDec put
|
||||||
JSONArray jsonArray = new JSONArray();
|
JSONArray jsonArray0 = new JSONArray();
|
||||||
jsonArray.put(bigInteger);
|
jsonArray0.put(bigInteger);
|
||||||
jsonArray.put(bigDecimal);
|
jsonArray0.put(bigDecimal);
|
||||||
actualFromPutStr = jsonArray.toString();
|
actualFromPutStr = jsonArray0.toString();
|
||||||
assertTrue("bigInt, bigDec from put is a number",
|
assertTrue("bigInt, bigDec from put is a number",
|
||||||
actualFromPutStr.equals(
|
actualFromPutStr.equals(
|
||||||
"[123456789012345678901234567890,123456789012345678901234567890.12345678901234567890123456789]"));
|
"[123456789012345678901234567890,123456789012345678901234567890.12345678901234567890123456789]"));
|
||||||
assertTrue("getBigInt is bigInt", jsonArray.getBigInteger(0).equals(bigInteger));
|
assertTrue("getBigInt is bigInt", jsonArray0.getBigInteger(0).equals(bigInteger));
|
||||||
assertTrue("getBigDec is bigDec", jsonArray.getBigDecimal(1).equals(bigDecimal));
|
assertTrue("getBigDec is bigDec", jsonArray0.getBigDecimal(1).equals(bigDecimal));
|
||||||
assertTrue("optBigInt is bigInt", jsonArray.optBigInteger(0, BigInteger.ONE).equals(bigInteger));
|
assertTrue("optBigInt is bigInt", jsonArray0.optBigInteger(0, BigInteger.ONE).equals(bigInteger));
|
||||||
assertTrue("optBigDec is bigDec", jsonArray.optBigDecimal(1, BigDecimal.ONE).equals(bigDecimal));
|
assertTrue("optBigDec is bigDec", jsonArray0.optBigDecimal(1, BigDecimal.ONE).equals(bigDecimal));
|
||||||
jsonArray.put(Boolean.TRUE);
|
jsonArray0.put(Boolean.TRUE);
|
||||||
try {
|
try {
|
||||||
jsonArray.getBigInteger(2);
|
jsonArray0.getBigInteger(2);
|
||||||
fail("should not be able to get big int");
|
fail("should not be able to get big int");
|
||||||
} catch (Exception ignored) {}
|
} catch (Exception ignored) {}
|
||||||
try {
|
try {
|
||||||
jsonArray.getBigDecimal(2);
|
jsonArray0.getBigDecimal(2);
|
||||||
fail("should not be able to get big dec");
|
fail("should not be able to get big dec");
|
||||||
} catch (Exception ignored) {}
|
} catch (Exception ignored) {}
|
||||||
assertTrue("optBigInt is default", jsonArray.optBigInteger(2, BigInteger.ONE).equals(BigInteger.ONE));
|
assertTrue("optBigInt is default", jsonArray0.optBigInteger(2, BigInteger.ONE).equals(BigInteger.ONE));
|
||||||
assertTrue("optBigDec is default", jsonArray.optBigDecimal(2, BigDecimal.ONE).equals(BigDecimal.ONE));
|
assertTrue("optBigDec is default", jsonArray0.optBigDecimal(2, BigDecimal.ONE).equals(BigDecimal.ONE));
|
||||||
|
|
||||||
// bigInt,bigDec list ctor
|
// bigInt,bigDec list ctor
|
||||||
List<Object> list = new ArrayList<Object>();
|
List<Object> list = new ArrayList<Object>();
|
||||||
list.add(bigInteger);
|
list.add(bigInteger);
|
||||||
list.add(bigDecimal);
|
list.add(bigDecimal);
|
||||||
jsonArray = new JSONArray(list);
|
JSONArray jsonArray1 = new JSONArray(list);
|
||||||
String actualFromListStr = jsonArray.toString();
|
String actualFromListStr = jsonArray1.toString();
|
||||||
assertTrue("bigInt, bigDec in list is a bigInt, bigDec",
|
assertTrue("bigInt, bigDec in list is a bigInt, bigDec",
|
||||||
actualFromListStr.equals(
|
actualFromListStr.equals(
|
||||||
"[123456789012345678901234567890,123456789012345678901234567890.12345678901234567890123456789]"));
|
"[123456789012345678901234567890,123456789012345678901234567890.12345678901234567890123456789]"));
|
||||||
// bigInt bean ctor
|
// bigInt bean ctor
|
||||||
MyBigNumberBean myBigNumberBean = mock(MyBigNumberBean.class);
|
MyBigNumberBean myBigNumberBean = mock(MyBigNumberBean.class);
|
||||||
when(myBigNumberBean.getBigInteger()).thenReturn(new BigInteger("123456789012345678901234567890"));
|
when(myBigNumberBean.getBigInteger()).thenReturn(new BigInteger("123456789012345678901234567890"));
|
||||||
jsonObject = new JSONObject(myBigNumberBean);
|
JSONObject jsonObject8 = new JSONObject(myBigNumberBean);
|
||||||
String actualFromBeanStr = jsonObject.toString();
|
String actualFromBeanStr = jsonObject8.toString();
|
||||||
// can't do a full string compare because mockery adds an extra key/value
|
// can't do a full string compare because mockery adds an extra key/value
|
||||||
assertTrue("bigInt from bean ctor is a bigInt",
|
assertTrue("bigInt from bean ctor is a bigInt",
|
||||||
actualFromBeanStr.contains("123456789012345678901234567890"));
|
actualFromBeanStr.contains("123456789012345678901234567890"));
|
||||||
// bigDec bean ctor
|
// bigDec bean ctor
|
||||||
myBigNumberBean = mock(MyBigNumberBean.class);
|
myBigNumberBean = mock(MyBigNumberBean.class);
|
||||||
when(myBigNumberBean.getBigDecimal()).thenReturn(new BigDecimal("123456789012345678901234567890.12345678901234567890123456789"));
|
when(myBigNumberBean.getBigDecimal()).thenReturn(new BigDecimal("123456789012345678901234567890.12345678901234567890123456789"));
|
||||||
jsonObject = new JSONObject(myBigNumberBean);
|
jsonObject8 = new JSONObject(myBigNumberBean);
|
||||||
actualFromBeanStr = jsonObject.toString();
|
actualFromBeanStr = jsonObject8.toString();
|
||||||
// can't do a full string compare because mockery adds an extra key/value
|
// can't do a full string compare because mockery adds an extra key/value
|
||||||
assertTrue("bigDec from bean ctor is a bigDec",
|
assertTrue("bigDec from bean ctor is a bigDec",
|
||||||
actualFromBeanStr.contains("123456789012345678901234567890.12345678901234567890123456789"));
|
actualFromBeanStr.contains("123456789012345678901234567890.12345678901234567890123456789"));
|
||||||
@@ -1426,7 +1442,12 @@ public class JSONObjectTest {
|
|||||||
assertTrue("wrap() returns big num",obj.equals(bigInteger));
|
assertTrue("wrap() returns big num",obj.equals(bigInteger));
|
||||||
obj = JSONObject.wrap(bigDecimal);
|
obj = JSONObject.wrap(bigDecimal);
|
||||||
assertTrue("wrap() returns string",obj.equals(bigDecimal));
|
assertTrue("wrap() returns string",obj.equals(bigDecimal));
|
||||||
|
Util.checkJSONObjectsMaps(new ArrayList<JSONObject>(Arrays.asList(
|
||||||
|
jsonObject0, jsonObject1, jsonObject2, jsonObject3, jsonObject4,
|
||||||
|
jsonObject5, jsonObject6, jsonObject7, jsonObject8
|
||||||
|
)));
|
||||||
|
Util.checkJSONArrayMaps(jsonArray0, jsonObject0.getMapType());
|
||||||
|
Util.checkJSONArrayMaps(jsonArray1, jsonObject0.getMapType());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1438,7 +1459,6 @@ public class JSONObjectTest {
|
|||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void jsonObjectNames() {
|
public void jsonObjectNames() {
|
||||||
JSONObject jsonObject;
|
|
||||||
|
|
||||||
// getNames() from null JSONObject
|
// getNames() from null JSONObject
|
||||||
assertTrue("null names from null Object",
|
assertTrue("null names from null Object",
|
||||||
@@ -1449,16 +1469,16 @@ public class JSONObjectTest {
|
|||||||
null == JSONObject.getNames(new MyJsonString()));
|
null == JSONObject.getNames(new MyJsonString()));
|
||||||
|
|
||||||
// getNames from new JSONOjbect
|
// getNames from new JSONOjbect
|
||||||
jsonObject = new JSONObject();
|
JSONObject jsonObject0 = new JSONObject();
|
||||||
String [] names = JSONObject.getNames(jsonObject);
|
String [] names = JSONObject.getNames(jsonObject0);
|
||||||
assertTrue("names should be null", names == null);
|
assertTrue("names should be null", names == null);
|
||||||
|
|
||||||
|
|
||||||
// getNames() from empty JSONObject
|
// getNames() from empty JSONObject
|
||||||
String emptyStr = "{}";
|
String emptyStr = "{}";
|
||||||
jsonObject = new JSONObject(emptyStr);
|
JSONObject jsonObject1 = new JSONObject(emptyStr);
|
||||||
assertTrue("empty JSONObject should have null names",
|
assertTrue("empty JSONObject should have null names",
|
||||||
null == JSONObject.getNames(jsonObject));
|
null == JSONObject.getNames(jsonObject1));
|
||||||
|
|
||||||
// getNames() from JSONObject
|
// getNames() from JSONObject
|
||||||
String str =
|
String str =
|
||||||
@@ -1467,13 +1487,13 @@ public class JSONObjectTest {
|
|||||||
"\"falseKey\":false,"+
|
"\"falseKey\":false,"+
|
||||||
"\"stringKey\":\"hello world!\","+
|
"\"stringKey\":\"hello world!\","+
|
||||||
"}";
|
"}";
|
||||||
jsonObject = new JSONObject(str);
|
JSONObject jsonObject2 = new JSONObject(str);
|
||||||
names = JSONObject.getNames(jsonObject);
|
names = JSONObject.getNames(jsonObject2);
|
||||||
JSONArray jsonArray = new JSONArray(names);
|
JSONArray jsonArray0 = new JSONArray(names);
|
||||||
|
|
||||||
// validate JSON
|
// validate JSON
|
||||||
Object doc = Configuration.defaultConfiguration().jsonProvider()
|
Object doc = Configuration.defaultConfiguration().jsonProvider()
|
||||||
.parse(jsonArray.toString());
|
.parse(jsonArray0.toString());
|
||||||
List<?> docList = JsonPath.read(doc, "$");
|
List<?> docList = JsonPath.read(doc, "$");
|
||||||
assertTrue("expected 3 items", docList.size() == 3);
|
assertTrue("expected 3 items", docList.size() == 3);
|
||||||
assertTrue(
|
assertTrue(
|
||||||
@@ -1494,9 +1514,9 @@ public class JSONObjectTest {
|
|||||||
names = JSONObject.getNames(myEnumField);
|
names = JSONObject.getNames(myEnumField);
|
||||||
|
|
||||||
// validate JSON
|
// validate JSON
|
||||||
jsonArray = new JSONArray(names);
|
JSONArray jsonArray1 = new JSONArray(names);
|
||||||
doc = Configuration.defaultConfiguration().jsonProvider()
|
doc = Configuration.defaultConfiguration().jsonProvider()
|
||||||
.parse(jsonArray.toString());
|
.parse(jsonArray1.toString());
|
||||||
docList = JsonPath.read(doc, "$");
|
docList = JsonPath.read(doc, "$");
|
||||||
assertTrue("expected 3 items", docList.size() == 3);
|
assertTrue("expected 3 items", docList.size() == 3);
|
||||||
assertTrue(
|
assertTrue(
|
||||||
@@ -1518,9 +1538,9 @@ public class JSONObjectTest {
|
|||||||
names = JSONObject.getNames(myPublicClass);
|
names = JSONObject.getNames(myPublicClass);
|
||||||
|
|
||||||
// validate JSON
|
// validate JSON
|
||||||
jsonArray = new JSONArray(names);
|
JSONArray jsonArray2 = new JSONArray(names);
|
||||||
doc = Configuration.defaultConfiguration().jsonProvider()
|
doc = Configuration.defaultConfiguration().jsonProvider()
|
||||||
.parse(jsonArray.toString());
|
.parse(jsonArray2.toString());
|
||||||
docList = JsonPath.read(doc, "$");
|
docList = JsonPath.read(doc, "$");
|
||||||
assertTrue("expected 2 items", docList.size() == 2);
|
assertTrue("expected 2 items", docList.size() == 2);
|
||||||
assertTrue(
|
assertTrue(
|
||||||
@@ -1529,6 +1549,12 @@ public class JSONObjectTest {
|
|||||||
assertTrue(
|
assertTrue(
|
||||||
"expected to find publicInt",
|
"expected to find publicInt",
|
||||||
((List<?>) JsonPath.read(doc, "$[?(@=='publicInt')]")).size() == 1);
|
((List<?>) JsonPath.read(doc, "$[?(@=='publicInt')]")).size() == 1);
|
||||||
|
Util.checkJSONObjectsMaps(new ArrayList<JSONObject>(Arrays.asList(
|
||||||
|
jsonObject0, jsonObject1, jsonObject2
|
||||||
|
)));
|
||||||
|
Util.checkJSONArrayMaps(jsonArray0, jsonObject0.getMapType());
|
||||||
|
Util.checkJSONArrayMaps(jsonArray1, jsonObject0.getMapType());
|
||||||
|
Util.checkJSONArrayMaps(jsonArray2, jsonObject0.getMapType());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1540,6 +1566,8 @@ public class JSONObjectTest {
|
|||||||
JSONObject jsonObject = new JSONObject();
|
JSONObject jsonObject = new JSONObject();
|
||||||
JSONArray jsonArray = jsonObject.names();
|
JSONArray jsonArray = jsonObject.names();
|
||||||
assertTrue("jsonArray should be null", jsonArray == null);
|
assertTrue("jsonArray should be null", jsonArray == null);
|
||||||
|
Util.checkJSONObjectMaps(jsonObject);
|
||||||
|
Util.checkJSONArrayMaps(jsonArray, jsonObject.getMapType());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1564,6 +1592,8 @@ public class JSONObjectTest {
|
|||||||
assertTrue("expected to find trueKey", ((List<?>) JsonPath.read(doc, "$[?(@=='trueKey')]")).size() == 1);
|
assertTrue("expected to find trueKey", ((List<?>) JsonPath.read(doc, "$[?(@=='trueKey')]")).size() == 1);
|
||||||
assertTrue("expected to find falseKey", ((List<?>) JsonPath.read(doc, "$[?(@=='falseKey')]")).size() == 1);
|
assertTrue("expected to find falseKey", ((List<?>) JsonPath.read(doc, "$[?(@=='falseKey')]")).size() == 1);
|
||||||
assertTrue("expected to find stringKey", ((List<?>) JsonPath.read(doc, "$[?(@=='stringKey')]")).size() == 1);
|
assertTrue("expected to find stringKey", ((List<?>) JsonPath.read(doc, "$[?(@=='stringKey')]")).size() == 1);
|
||||||
|
Util.checkJSONObjectMaps(jsonObject);
|
||||||
|
Util.checkJSONArrayMaps(jsonArray, jsonObject.getMapType());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1682,7 +1712,9 @@ public class JSONObjectTest {
|
|||||||
// this.put(key, new Float((Float) value + 1));
|
// this.put(key, new Float((Float) value + 1));
|
||||||
// Probably it would be better to deprecate the method and remove some day, while convenient processing the "payload" is not
|
// Probably it would be better to deprecate the method and remove some day, while convenient processing the "payload" is not
|
||||||
// really in the scope of a JSON-library (IMHO.)
|
// really in the scope of a JSON-library (IMHO.)
|
||||||
|
Util.checkJSONObjectsMaps(new ArrayList<JSONObject>(Arrays.asList(
|
||||||
|
jsonObject, inc
|
||||||
|
)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1780,6 +1812,12 @@ public class JSONObjectTest {
|
|||||||
JSONObject bCompareArrayJsonObject = new JSONObject(bCompareArrayStr);
|
JSONObject bCompareArrayJsonObject = new JSONObject(bCompareArrayStr);
|
||||||
assertTrue("different nested JSONArrays should not be similar",
|
assertTrue("different nested JSONArrays should not be similar",
|
||||||
!aCompareArrayJsonObject.similar(bCompareArrayJsonObject));
|
!aCompareArrayJsonObject.similar(bCompareArrayJsonObject));
|
||||||
|
Util.checkJSONObjectsMaps(new ArrayList<JSONObject>(Arrays.asList(
|
||||||
|
jsonObject, expectedJsonObject, aCompareValueJsonObject,
|
||||||
|
aCompareArrayJsonObject, aCompareObjectJsonObject, aCompareArrayJsonObject,
|
||||||
|
bCompareValueJsonObject, bCompareArrayJsonObject, bCompareObjectJsonObject,
|
||||||
|
bCompareArrayJsonObject
|
||||||
|
)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1815,6 +1853,7 @@ public class JSONObjectTest {
|
|||||||
assertTrue("expected myVal2", "myVal2".equals(jsonObject.query("/objectKey/myKey2")));
|
assertTrue("expected myVal2", "myVal2".equals(jsonObject.query("/objectKey/myKey2")));
|
||||||
assertTrue("expected myVal3", "myVal3".equals(jsonObject.query("/objectKey/myKey3")));
|
assertTrue("expected myVal3", "myVal3".equals(jsonObject.query("/objectKey/myKey3")));
|
||||||
assertTrue("expected myVal4", "myVal4".equals(jsonObject.query("/objectKey/myKey4")));
|
assertTrue("expected myVal4", "myVal4".equals(jsonObject.query("/objectKey/myKey4")));
|
||||||
|
Util.checkJSONObjectMaps(jsonObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1888,6 +1927,9 @@ public class JSONObjectTest {
|
|||||||
|
|
||||||
JSONObject jo = new JSONObject().put("TABLE", new JSONObject().put("yhoo", new JSONObject()));
|
JSONObject jo = new JSONObject().put("TABLE", new JSONObject().put("yhoo", new JSONObject()));
|
||||||
assertEquals("toString(2)","{\"TABLE\": {\"yhoo\": {}}}", jo.toString(2));
|
assertEquals("toString(2)","{\"TABLE\": {\"yhoo\": {}}}", jo.toString(2));
|
||||||
|
Util.checkJSONObjectsMaps(new ArrayList<JSONObject>(Arrays.asList(
|
||||||
|
jsonObject, jo
|
||||||
|
)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1909,6 +1951,7 @@ public class JSONObjectTest {
|
|||||||
assertTrue("expected 1 top level item", ((Map<?,?>)(JsonPath.read(doc, "$"))).size() == 1);
|
assertTrue("expected 1 top level item", ((Map<?,?>)(JsonPath.read(doc, "$"))).size() == 1);
|
||||||
assertTrue("expected 1 key item", ((Map<?,?>)(JsonPath.read(doc, "$.key"))).size() == 1);
|
assertTrue("expected 1 key item", ((Map<?,?>)(JsonPath.read(doc, "$.key"))).size() == 1);
|
||||||
assertTrue("expected def", "def".equals(jsonObject.query("/key/abc")));
|
assertTrue("expected def", "def".equals(jsonObject.query("/key/abc")));
|
||||||
|
Util.checkJSONObjectMaps(jsonObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1931,6 +1974,7 @@ public class JSONObjectTest {
|
|||||||
assertTrue("expected 1 top level item", ((Map<?,?>)(JsonPath.read(doc, "$"))).size() == 1);
|
assertTrue("expected 1 top level item", ((Map<?,?>)(JsonPath.read(doc, "$"))).size() == 1);
|
||||||
assertTrue("expected 1 key item", ((List<?>)(JsonPath.read(doc, "$.key"))).size() == 1);
|
assertTrue("expected 1 key item", ((List<?>)(JsonPath.read(doc, "$.key"))).size() == 1);
|
||||||
assertTrue("expected abc", "abc".equals(jsonObject.query("/key/0")));
|
assertTrue("expected abc", "abc".equals(jsonObject.query("/key/0")));
|
||||||
|
Util.checkJSONObjectMaps(jsonObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1979,6 +2023,8 @@ public class JSONObjectTest {
|
|||||||
Integer[] array = { new Integer(1), new Integer(2), new Integer(3) };
|
Integer[] array = { new Integer(1), new Integer(2), new Integer(3) };
|
||||||
assertTrue("array valueToString() incorrect",
|
assertTrue("array valueToString() incorrect",
|
||||||
jsonArray.toString().equals(JSONObject.valueToString(array)));
|
jsonArray.toString().equals(JSONObject.valueToString(array)));
|
||||||
|
Util.checkJSONObjectMaps(jsonObject);
|
||||||
|
Util.checkJSONArrayMaps(jsonArray, jsonObject.getMapType());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -2082,6 +2128,11 @@ public class JSONObjectTest {
|
|||||||
assertTrue("expected val1", "val1".equals(mapJsonObject.query("/key1")));
|
assertTrue("expected val1", "val1".equals(mapJsonObject.query("/key1")));
|
||||||
assertTrue("expected val2", "val2".equals(mapJsonObject.query("/key2")));
|
assertTrue("expected val2", "val2".equals(mapJsonObject.query("/key2")));
|
||||||
assertTrue("expected val3", "val3".equals(mapJsonObject.query("/key3")));
|
assertTrue("expected val3", "val3".equals(mapJsonObject.query("/key3")));
|
||||||
|
Util.checkJSONObjectsMaps(new ArrayList<JSONObject>(Arrays.asList(
|
||||||
|
jsonObject, mapJsonObject
|
||||||
|
)));
|
||||||
|
Util.checkJSONArrayMaps(jsonArray, jsonObject.getMapType());
|
||||||
|
Util.checkJSONArrayMaps(integerArrayJsonArray, jsonObject.getMapType());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -2096,6 +2147,7 @@ public class JSONObjectTest {
|
|||||||
try {
|
try {
|
||||||
JSONObject jo = new JSONObject(source);
|
JSONObject jo = new JSONObject(source);
|
||||||
assertTrue("Expected "+charString+"("+i+") in the JSON Object but did not find it.",charString.equals(jo.getString("key")));
|
assertTrue("Expected "+charString+"("+i+") in the JSON Object but did not find it.",charString.equals(jo.getString("key")));
|
||||||
|
Util.checkJSONObjectMaps(jo);
|
||||||
} catch (JSONException ex) {
|
} catch (JSONException ex) {
|
||||||
assertTrue("Only \\0 (U+0000), \\n (U+000A), and \\r (U+000D) should cause an error. Instead "+charString+"("+i+") caused an error",
|
assertTrue("Only \\0 (U+0000), \\n (U+000A), and \\r (U+000D) should cause an error. Instead "+charString+"("+i+") caused an error",
|
||||||
i=='\0' || i=='\n' || i=='\r'
|
i=='\0' || i=='\n' || i=='\r'
|
||||||
@@ -2395,6 +2447,7 @@ public class JSONObjectTest {
|
|||||||
assertTrue("jsonObject should be empty", jsonObject.isEmpty());
|
assertTrue("jsonObject should be empty", jsonObject.isEmpty());
|
||||||
jsonObject.putOnce(null, "");
|
jsonObject.putOnce(null, "");
|
||||||
assertTrue("jsonObject should be empty", jsonObject.isEmpty());
|
assertTrue("jsonObject should be empty", jsonObject.isEmpty());
|
||||||
|
Util.checkJSONObjectMaps(jsonObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -2430,6 +2483,7 @@ public class JSONObjectTest {
|
|||||||
42l == jsonObject.optNumber("myKey", Long.valueOf(42)).longValue());
|
42l == jsonObject.optNumber("myKey", Long.valueOf(42)).longValue());
|
||||||
assertTrue("optString() should return default string",
|
assertTrue("optString() should return default string",
|
||||||
"hi".equals(jsonObject.optString("hiKey", "hi")));
|
"hi".equals(jsonObject.optString("hiKey", "hi")));
|
||||||
|
Util.checkJSONObjectMaps(jsonObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -2466,6 +2520,7 @@ public class JSONObjectTest {
|
|||||||
42l == jsonObject.optNumber("myKey", Long.valueOf(42)).longValue());
|
42l == jsonObject.optNumber("myKey", Long.valueOf(42)).longValue());
|
||||||
assertTrue("optString() should return default string",
|
assertTrue("optString() should return default string",
|
||||||
"hi".equals(jsonObject.optString("hiKey", "hi")));
|
"hi".equals(jsonObject.optString("hiKey", "hi")));
|
||||||
|
Util.checkJSONObjectMaps(jsonObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -2484,6 +2539,7 @@ public class JSONObjectTest {
|
|||||||
assertTrue("unexpected optBigDecimal value",jo.optBigDecimal("int",BigDecimal.ZERO).compareTo(new BigDecimal("123"))==0);
|
assertTrue("unexpected optBigDecimal value",jo.optBigDecimal("int",BigDecimal.ZERO).compareTo(new BigDecimal("123"))==0);
|
||||||
assertTrue("unexpected optBigDecimal value",jo.optBigDecimal("int",BigDecimal.ZERO).compareTo(new BigDecimal("123"))==0);
|
assertTrue("unexpected optBigDecimal value",jo.optBigDecimal("int",BigDecimal.ZERO).compareTo(new BigDecimal("123"))==0);
|
||||||
assertTrue("unexpected optNumber value",jo.optNumber("int",BigInteger.ZERO).longValue()==123l);
|
assertTrue("unexpected optNumber value",jo.optNumber("int",BigInteger.ZERO).longValue()==123l);
|
||||||
|
Util.checkJSONObjectMaps(jo);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -2518,6 +2574,7 @@ public class JSONObjectTest {
|
|||||||
assertNotEquals((int)Double.parseDouble("19007199254740993.35481234487103587486413587843213584"), jo.optInt("largeNumberStr"));
|
assertNotEquals((int)Double.parseDouble("19007199254740993.35481234487103587486413587843213584"), jo.optInt("largeNumberStr"));
|
||||||
assertEquals(19007199254740992l, (long)Double.parseDouble("19007199254740993.35481234487103587486413587843213584"));
|
assertEquals(19007199254740992l, (long)Double.parseDouble("19007199254740993.35481234487103587486413587843213584"));
|
||||||
assertEquals(2147483647, (int)Double.parseDouble("19007199254740993.35481234487103587486413587843213584"));
|
assertEquals(2147483647, (int)Double.parseDouble("19007199254740993.35481234487103587486413587843213584"));
|
||||||
|
Util.checkJSONObjectMaps(jo);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -2540,6 +2597,7 @@ public class JSONObjectTest {
|
|||||||
assertNull(jo.optBigDecimal("nullVal", null));
|
assertNull(jo.optBigDecimal("nullVal", null));
|
||||||
assertEquals(jo.optBigDecimal("float", null),jo.getBigDecimal("float"));
|
assertEquals(jo.optBigDecimal("float", null),jo.getBigDecimal("float"));
|
||||||
assertEquals(jo.optBigDecimal("double", null),jo.getBigDecimal("double"));
|
assertEquals(jo.optBigDecimal("double", null),jo.getBigDecimal("double"));
|
||||||
|
Util.checkJSONObjectMaps(jo);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -2560,6 +2618,7 @@ public class JSONObjectTest {
|
|||||||
assertEquals(new BigInteger("1234"),jo.optBigInteger("bigInteger", null));
|
assertEquals(new BigInteger("1234"),jo.optBigInteger("bigInteger", null));
|
||||||
assertEquals(new BigInteger("1234"),jo.optBigInteger("bigDecimal", null));
|
assertEquals(new BigInteger("1234"),jo.optBigInteger("bigDecimal", null));
|
||||||
assertNull(jo.optBigDecimal("nullVal", null));
|
assertNull(jo.optBigDecimal("nullVal", null));
|
||||||
|
Util.checkJSONObjectMaps(jo);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -2577,8 +2636,9 @@ public class JSONObjectTest {
|
|||||||
JSONObject jsonObjectPutNull = new JSONObject(str);
|
JSONObject jsonObjectPutNull = new JSONObject(str);
|
||||||
jsonObjectPutNull.put("myKey", (Object) null);
|
jsonObjectPutNull.put("myKey", (Object) null);
|
||||||
assertTrue("jsonObject should be empty", jsonObjectPutNull.isEmpty());
|
assertTrue("jsonObject should be empty", jsonObjectPutNull.isEmpty());
|
||||||
|
Util.checkJSONObjectsMaps(new ArrayList<JSONObject>(Arrays.asList(
|
||||||
|
jsonObjectRemove, jsonObjectPutNull
|
||||||
|
)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -2663,6 +2723,7 @@ public class JSONObjectTest {
|
|||||||
} finally {
|
} finally {
|
||||||
stringWriter.close();
|
stringWriter.close();
|
||||||
}
|
}
|
||||||
|
Util.checkJSONObjectMaps(jsonObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -2745,7 +2806,7 @@ public class JSONObjectTest {
|
|||||||
writer.close();
|
writer.close();
|
||||||
} catch (Exception e) {}
|
} catch (Exception e) {}
|
||||||
}
|
}
|
||||||
|
Util.checkJSONObjectMaps(jsonObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -2813,6 +2874,7 @@ public class JSONObjectTest {
|
|||||||
stringWriter.close();
|
stringWriter.close();
|
||||||
} catch (Exception e) {}
|
} catch (Exception e) {}
|
||||||
}
|
}
|
||||||
|
Util.checkJSONObjectMaps(jsonObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -2855,6 +2917,7 @@ public class JSONObjectTest {
|
|||||||
JSONObject aJsonObject = new JSONObject(str);
|
JSONObject aJsonObject = new JSONObject(str);
|
||||||
assertTrue("Same JSONObject should be equal to itself",
|
assertTrue("Same JSONObject should be equal to itself",
|
||||||
aJsonObject.equals(aJsonObject));
|
aJsonObject.equals(aJsonObject));
|
||||||
|
Util.checkJSONObjectMaps(aJsonObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -2940,6 +3003,9 @@ public class JSONObjectTest {
|
|||||||
"<key>null</key>".equals(sJONull));
|
"<key>null</key>".equals(sJONull));
|
||||||
String sNull = XML.toString(jsonObjectNull);
|
String sNull = XML.toString(jsonObjectNull);
|
||||||
assertTrue("null should emit an empty string", "".equals(sNull));
|
assertTrue("null should emit an empty string", "".equals(sNull));
|
||||||
|
Util.checkJSONObjectsMaps(new ArrayList<JSONObject>(Arrays.asList(
|
||||||
|
jsonObjectJONull, jsonObjectNull
|
||||||
|
)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expected = JSONPointerException.class)
|
@Test(expected = JSONPointerException.class)
|
||||||
@@ -3037,6 +3103,7 @@ public class JSONObjectTest {
|
|||||||
// assert that the new map is mutable
|
// assert that the new map is mutable
|
||||||
assertTrue("Removing a key should succeed", map.remove("key3") != null);
|
assertTrue("Removing a key should succeed", map.remove("key3") != null);
|
||||||
assertTrue("Map should have 2 elements", map.size() == 2);
|
assertTrue("Map should have 2 elements", map.size() == 2);
|
||||||
|
Util.checkJSONObjectMaps(jsonObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -3061,6 +3128,9 @@ public class JSONObjectTest {
|
|||||||
// ensure our original jo hasn't changed.
|
// ensure our original jo hasn't changed.
|
||||||
assertEquals(0, jo.get("someInt"));
|
assertEquals(0, jo.get("someInt"));
|
||||||
assertEquals(null, jo.opt("someString"));
|
assertEquals(null, jo.opt("someString"));
|
||||||
|
Util.checkJSONObjectsMaps(new ArrayList<JSONObject>(Arrays.asList(
|
||||||
|
jo, jo2
|
||||||
|
)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -3085,6 +3155,9 @@ public class JSONObjectTest {
|
|||||||
// ensure our original jo hasn't changed.
|
// ensure our original jo hasn't changed.
|
||||||
assertEquals(0, jo.get("someInt"));
|
assertEquals(0, jo.get("someInt"));
|
||||||
assertEquals(null, jo.opt("someString"));
|
assertEquals(null, jo.opt("someString"));
|
||||||
|
Util.checkJSONObjectsMaps(new ArrayList<JSONObject>(Arrays.asList(
|
||||||
|
jo, jo2
|
||||||
|
)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -3100,6 +3173,7 @@ public class JSONObjectTest {
|
|||||||
assertEquals("Expected the getter to only be called once",
|
assertEquals("Expected the getter to only be called once",
|
||||||
1, bean.genericGetCounter);
|
1, bean.genericGetCounter);
|
||||||
assertEquals(0, bean.genericSetCounter);
|
assertEquals(0, bean.genericSetCounter);
|
||||||
|
Util.checkJSONObjectMaps(jo);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -3115,6 +3189,7 @@ public class JSONObjectTest {
|
|||||||
assertEquals("Expected the getter to only be called once",
|
assertEquals("Expected the getter to only be called once",
|
||||||
1, bean.genericGetCounter);
|
1, bean.genericGetCounter);
|
||||||
assertEquals(0, bean.genericSetCounter);
|
assertEquals(0, bean.genericSetCounter);
|
||||||
|
Util.checkJSONObjectMaps(jo);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -3133,6 +3208,7 @@ public class JSONObjectTest {
|
|||||||
assertEquals("Expected 1 key to be mapped. Instead found: "+jo.keySet().toString(),
|
assertEquals("Expected 1 key to be mapped. Instead found: "+jo.keySet().toString(),
|
||||||
1, jo.length());
|
1, jo.length());
|
||||||
assertNotNull(jo.get("ALL"));
|
assertNotNull(jo.get("ALL"));
|
||||||
|
Util.checkJSONObjectMaps(jo);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -3150,6 +3226,8 @@ public class JSONObjectTest {
|
|||||||
BigDecimal wantedValue = BigDecimal.valueOf(value);
|
BigDecimal wantedValue = BigDecimal.valueOf(value);
|
||||||
|
|
||||||
assertEquals(current, wantedValue);
|
assertEquals(current, wantedValue);
|
||||||
|
Util.checkJSONObjectMaps(jsonObject);
|
||||||
|
Util.checkJSONArrayMaps(array, jsonObject.getMapType());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -3163,6 +3241,7 @@ public class JSONObjectTest {
|
|||||||
1, jo.length());
|
1, jo.length());
|
||||||
assertTrue(jo.get("closeable") instanceof JSONObject);
|
assertTrue(jo.get("closeable") instanceof JSONObject);
|
||||||
assertTrue(jo.getJSONObject("closeable").has("string"));
|
assertTrue(jo.getJSONObject("closeable").has("string"));
|
||||||
|
Util.checkJSONObjectMaps(jo);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expected=NullPointerException.class)
|
@Test(expected=NullPointerException.class)
|
||||||
@@ -3289,9 +3368,12 @@ public class JSONObjectTest {
|
|||||||
ObjC.setRef(ObjA);
|
ObjC.setRef(ObjA);
|
||||||
ObjB.setRef(ObjA);
|
ObjB.setRef(ObjA);
|
||||||
ObjB.setRef2(ObjA);
|
ObjB.setRef2(ObjA);
|
||||||
new JSONObject(ObjC);
|
JSONObject j0 = new JSONObject(ObjC);
|
||||||
new JSONObject(ObjB);
|
JSONObject j1 = new JSONObject(ObjB);
|
||||||
new JSONObject(ObjA);
|
JSONObject j2 = new JSONObject(ObjA);
|
||||||
|
Util.checkJSONObjectsMaps(new ArrayList<JSONObject>(Arrays.asList(
|
||||||
|
j0, j1, j2
|
||||||
|
)));
|
||||||
}
|
}
|
||||||
@Test
|
@Test
|
||||||
public void testLongRepeatObjectNotRecursive() {
|
public void testLongRepeatObjectNotRecursive() {
|
||||||
@@ -3307,17 +3389,21 @@ public class JSONObjectTest {
|
|||||||
ObjB.setRef2(ObjD);
|
ObjB.setRef2(ObjD);
|
||||||
ObjA.setRef(ObjD);
|
ObjA.setRef(ObjD);
|
||||||
ObjD.setRef(ObjE);
|
ObjD.setRef(ObjE);
|
||||||
new JSONObject(ObjC);
|
JSONObject j0 = new JSONObject(ObjC);
|
||||||
new JSONObject(ObjB);
|
JSONObject j1 = new JSONObject(ObjB);
|
||||||
new JSONObject(ObjA);
|
JSONObject j2 = new JSONObject(ObjA);
|
||||||
new JSONObject(ObjD);
|
JSONObject j3 = new JSONObject(ObjD);
|
||||||
new JSONObject(ObjE);
|
JSONObject j4 = new JSONObject(ObjE);
|
||||||
|
Util.checkJSONObjectsMaps(new ArrayList<JSONObject>(Arrays.asList(
|
||||||
|
j0, j1, j2, j3, j4
|
||||||
|
)));
|
||||||
}
|
}
|
||||||
@Test(expected=JSONException.class)
|
@Test(expected=JSONException.class)
|
||||||
public void testRecursiveEquals() {
|
public void testRecursiveEquals() {
|
||||||
RecursiveBeanEquals a = new RecursiveBeanEquals("same");
|
RecursiveBeanEquals a = new RecursiveBeanEquals("same");
|
||||||
a.setRef(a);
|
a.setRef(a);
|
||||||
new JSONObject(a);
|
JSONObject j0 = new JSONObject(a);
|
||||||
|
Util.checkJSONObjectMaps(j0);
|
||||||
}
|
}
|
||||||
@Test
|
@Test
|
||||||
public void testNotRecursiveEquals() {
|
public void testNotRecursiveEquals() {
|
||||||
@@ -3326,7 +3412,8 @@ public class JSONObjectTest {
|
|||||||
RecursiveBeanEquals c = new RecursiveBeanEquals("same");
|
RecursiveBeanEquals c = new RecursiveBeanEquals("same");
|
||||||
a.setRef(b);
|
a.setRef(b);
|
||||||
b.setRef(c);
|
b.setRef(c);
|
||||||
new JSONObject(a);
|
JSONObject j0 = new JSONObject(a);
|
||||||
|
Util.checkJSONObjectMaps(j0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -3336,6 +3423,7 @@ public class JSONObjectTest {
|
|||||||
assertTrue("missing expected key 'empty_json_array'", jsonObject.has("empty_json_array"));
|
assertTrue("missing expected key 'empty_json_array'", jsonObject.has("empty_json_array"));
|
||||||
assertNotNull("'empty_json_array' should be an array", jsonObject.getJSONArray("empty_json_array"));
|
assertNotNull("'empty_json_array' should be an array", jsonObject.getJSONArray("empty_json_array"));
|
||||||
assertEquals("'empty_json_array' should have a length of 0", 0, jsonObject.getJSONArray("empty_json_array").length());
|
assertEquals("'empty_json_array' should have a length of 0", 0, jsonObject.getJSONArray("empty_json_array").length());
|
||||||
|
Util.checkJSONObjectMaps(jsonObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -3351,6 +3439,7 @@ public class JSONObjectTest {
|
|||||||
jsonObject.clear(); //Clears the JSONObject
|
jsonObject.clear(); //Clears the JSONObject
|
||||||
assertTrue("expected jsonObject.length() == 0", jsonObject.length() == 0); //Check if its length is 0
|
assertTrue("expected jsonObject.length() == 0", jsonObject.length() == 0); //Check if its length is 0
|
||||||
jsonObject.getInt("key1"); //Should throws org.json.JSONException: JSONObject["asd"] not found
|
jsonObject.getInt("key1"); //Should throws org.json.JSONException: JSONObject["asd"] not found
|
||||||
|
Util.checkJSONObjectMaps(jsonObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -3364,6 +3453,7 @@ public class JSONObjectTest {
|
|||||||
JSONObject json_input = new JSONObject(input);
|
JSONObject json_input = new JSONObject(input);
|
||||||
assertNotNull(json_input);
|
assertNotNull(json_input);
|
||||||
fail("Excepected Exception.");
|
fail("Excepected Exception.");
|
||||||
|
Util.checkJSONObjectMaps(json_input);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -3373,7 +3463,7 @@ public class JSONObjectTest {
|
|||||||
public void issue654IncorrectNestingNoKey1() {
|
public void issue654IncorrectNestingNoKey1() {
|
||||||
JSONObject json_input = new JSONObject("{{\"a\":0}}");
|
JSONObject json_input = new JSONObject("{{\"a\":0}}");
|
||||||
assertNotNull(json_input);
|
assertNotNull(json_input);
|
||||||
fail("Excepected Exception.");
|
fail("Expected Exception.");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -3398,4 +3488,25 @@ public class JSONObjectTest {
|
|||||||
assertNotNull(json_input);
|
assertNotNull(json_input);
|
||||||
fail("Excepected Exception.");
|
fail("Excepected Exception.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIssue682SimilarityOfJSONString() {
|
||||||
|
JSONObject jo1 = new JSONObject()
|
||||||
|
.put("a", new MyJsonString())
|
||||||
|
.put("b", 2);
|
||||||
|
JSONObject jo2 = new JSONObject()
|
||||||
|
.put("a", new MyJsonString())
|
||||||
|
.put("b", 2);
|
||||||
|
assertTrue(jo1.similar(jo2));
|
||||||
|
|
||||||
|
JSONObject jo3 = new JSONObject()
|
||||||
|
.put("a", new JSONString() {
|
||||||
|
@Override
|
||||||
|
public String toJSONString() {
|
||||||
|
return "\"different value\"";
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.put("b", 2);
|
||||||
|
assertFalse(jo1.similar(jo3));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,27 +1,7 @@
|
|||||||
package org.json.junit;
|
package org.json.junit;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2020 JSON.org
|
Public Domain.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
@@ -92,8 +72,10 @@ public class JSONPointerTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void queryByEmptyKeySubObject() {
|
public void queryByEmptyKeySubObject() {
|
||||||
assertEquals( "{\"\":\"empty key of an object with an empty key\",\"subKey\":\"Some" +
|
JSONObject json = new JSONObject("{\"\":\"empty key of an object with an empty key\",\"subKey\":\"Some" +
|
||||||
" other value\"}", query("/obj/").toString());
|
" other value\"}");
|
||||||
|
JSONObject obj = (JSONObject) query("/obj/");
|
||||||
|
assertTrue(json.similar(obj));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
@@ -1,27 +1,7 @@
|
|||||||
package org.json.junit;
|
package org.json.junit;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2020 JSON.org
|
Public Domain.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import static org.junit.Assert.*;
|
import static org.junit.Assert.*;
|
||||||
|
|||||||
@@ -1,27 +1,7 @@
|
|||||||
package org.json.junit;
|
package org.json.junit;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2020 JSON.org
|
Public Domain.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import static org.junit.Assert.*;
|
import static org.junit.Assert.*;
|
||||||
|
|||||||
@@ -1,27 +1,7 @@
|
|||||||
package org.json.junit;
|
package org.json.junit;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2020 JSON.org
|
Public Domain.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|||||||
@@ -1,27 +1,7 @@
|
|||||||
package org.json.junit;
|
package org.json.junit;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2020 JSON.org
|
Public Domain.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|||||||
@@ -1,27 +1,7 @@
|
|||||||
package org.json.junit;
|
package org.json.junit;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2020 JSON.org
|
Public Domain.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import static org.junit.Assert.*;
|
import static org.junit.Assert.*;
|
||||||
@@ -78,7 +58,6 @@ public class Util {
|
|||||||
* or something else.
|
* or something else.
|
||||||
* @param value created by the code to be tested
|
* @param value created by the code to be tested
|
||||||
* @param expectedValue created specifically for comparing
|
* @param expectedValue created specifically for comparing
|
||||||
* @param key key to the jsonObject entry to be compared
|
|
||||||
*/
|
*/
|
||||||
private static void compareActualVsExpectedObjects(Object value,
|
private static void compareActualVsExpectedObjects(Object value,
|
||||||
Object expectedValue) {
|
Object expectedValue) {
|
||||||
@@ -117,4 +96,106 @@ public class Util {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Asserts that all JSONObject maps are the same as the default ctor
|
||||||
|
* @param jsonObjects list of objects to be tested
|
||||||
|
*/
|
||||||
|
public static void checkJSONObjectsMaps(List<JSONObject> jsonObjects) {
|
||||||
|
if (jsonObjects == null || jsonObjects.size() == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Class<? extends Map> mapType = new JSONObject().getMapType();
|
||||||
|
for (JSONObject jsonObject : jsonObjects) {
|
||||||
|
if (jsonObject != null) {
|
||||||
|
assertTrue(mapType == jsonObject.getMapType());
|
||||||
|
checkJSONObjectMaps(jsonObject, mapType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Asserts that all JSONObject maps are the same as the default ctor
|
||||||
|
* @param jsonObject the object to be tested
|
||||||
|
*/
|
||||||
|
public static void checkJSONObjectMaps(JSONObject jsonObject) {
|
||||||
|
if (jsonObject != null) {
|
||||||
|
checkJSONObjectMaps(jsonObject, jsonObject.getMapType());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Asserts that all JSONObject maps are the same as mapType
|
||||||
|
* @param jsonObject object to be tested
|
||||||
|
* @param mapType mapType to test against
|
||||||
|
*/
|
||||||
|
public static void checkJSONObjectMaps(JSONObject jsonObject, Class<? extends Map> mapType) {
|
||||||
|
if (mapType == null) {
|
||||||
|
mapType = new JSONObject().getMapType();
|
||||||
|
}
|
||||||
|
Set<String> keys = jsonObject.keySet();
|
||||||
|
for (String key : keys) {
|
||||||
|
Object val = jsonObject.get(key);
|
||||||
|
if (val instanceof JSONObject) {
|
||||||
|
JSONObject jsonObjectVal = (JSONObject) val;
|
||||||
|
assertTrue(mapType == ((JSONObject) val).getMapType());
|
||||||
|
checkJSONObjectMaps(jsonObjectVal, mapType);
|
||||||
|
} else if (val instanceof JSONArray) {
|
||||||
|
JSONArray jsonArrayVal = (JSONArray)val;
|
||||||
|
checkJSONArrayMaps(jsonArrayVal, mapType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Asserts that all JSONObject maps in the JSONArray object match the default map
|
||||||
|
* @param jsonArrays list of JSONArray objects to be tested
|
||||||
|
*/
|
||||||
|
public static void checkJSONArraysMaps(List<JSONArray> jsonArrays) {
|
||||||
|
if (jsonArrays == null || jsonArrays.size() == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Class<? extends Map> mapType = new JSONObject().getMapType();
|
||||||
|
for (JSONArray jsonArray : jsonArrays) {
|
||||||
|
if (jsonArray != null) {
|
||||||
|
checkJSONArrayMaps(jsonArray, mapType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Asserts that all JSONObject maps in the JSONArray object match mapType
|
||||||
|
* @param jsonArray object to be tested
|
||||||
|
* @param mapType map type to be tested against
|
||||||
|
*/
|
||||||
|
public static void checkJSONArrayMaps(JSONArray jsonArray, Class<? extends Map> mapType) {
|
||||||
|
if (jsonArray == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (mapType == null) {
|
||||||
|
mapType = new JSONObject().getMapType();
|
||||||
|
}
|
||||||
|
Iterator<Object> it = jsonArray.iterator();
|
||||||
|
while (it.hasNext()) {
|
||||||
|
Object val = it.next();
|
||||||
|
if (val instanceof JSONObject) {
|
||||||
|
JSONObject jsonObjectVal = (JSONObject)val;
|
||||||
|
checkJSONObjectMaps(jsonObjectVal, mapType);
|
||||||
|
} else if (val instanceof JSONArray) {
|
||||||
|
JSONArray jsonArrayVal = (JSONArray)val;
|
||||||
|
checkJSONArrayMaps(jsonArrayVal, mapType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Asserts that all JSONObject maps nested in the JSONArray match
|
||||||
|
* the default mapType
|
||||||
|
* @param jsonArray the object to be tested
|
||||||
|
*/
|
||||||
|
public static void checkJSONArrayMaps(JSONArray jsonArray) {
|
||||||
|
if (jsonArray != null) {
|
||||||
|
checkJSONArrayMaps(jsonArray, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,27 +1,7 @@
|
|||||||
package org.json.junit;
|
package org.json.junit;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2020 JSON.org
|
Public Domain.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
@@ -1072,6 +1052,29 @@ public class XMLConfigurationTest {
|
|||||||
Util.compareActualVsExpectedJsonObjects(jsonObject, expetedJsonObject);
|
Util.compareActualVsExpectedJsonObjects(jsonObject, expetedJsonObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMaxNestingDepthIsSet() {
|
||||||
|
XMLParserConfiguration xmlParserConfiguration = XMLParserConfiguration.ORIGINAL;
|
||||||
|
|
||||||
|
assertEquals(xmlParserConfiguration.getMaxNestingDepth(), XMLParserConfiguration.DEFAULT_MAXIMUM_NESTING_DEPTH);
|
||||||
|
|
||||||
|
xmlParserConfiguration = xmlParserConfiguration.withMaxNestingDepth(42);
|
||||||
|
|
||||||
|
assertEquals(xmlParserConfiguration.getMaxNestingDepth(), 42);
|
||||||
|
|
||||||
|
xmlParserConfiguration = xmlParserConfiguration.withMaxNestingDepth(0);
|
||||||
|
|
||||||
|
assertEquals(xmlParserConfiguration.getMaxNestingDepth(), 0);
|
||||||
|
|
||||||
|
xmlParserConfiguration = xmlParserConfiguration.withMaxNestingDepth(-31415926);
|
||||||
|
|
||||||
|
assertEquals(xmlParserConfiguration.getMaxNestingDepth(), XMLParserConfiguration.UNDEFINED_MAXIMUM_NESTING_DEPTH);
|
||||||
|
|
||||||
|
xmlParserConfiguration = xmlParserConfiguration.withMaxNestingDepth(Integer.MIN_VALUE);
|
||||||
|
|
||||||
|
assertEquals(xmlParserConfiguration.getMaxNestingDepth(), XMLParserConfiguration.UNDEFINED_MAXIMUM_NESTING_DEPTH);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convenience method, given an input string and expected result,
|
* Convenience method, given an input string and expected result,
|
||||||
* convert to JSONObject and compare actual to expected result.
|
* convert to JSONObject and compare actual to expected result.
|
||||||
|
|||||||
@@ -1,27 +1,7 @@
|
|||||||
package org.json.junit;
|
package org.json.junit;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2020 JSON.org
|
Public Domain.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
The Software shall be used for Good, not Evil.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
@@ -41,13 +21,7 @@ import java.io.StringReader;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.json.JSONArray;
|
import org.json.*;
|
||||||
import org.json.JSONException;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
import org.json.JSONTokener;
|
|
||||||
import org.json.XML;
|
|
||||||
import org.json.XMLParserConfiguration;
|
|
||||||
import org.json.XMLXsiTypeConverter;
|
|
||||||
import org.junit.Rule;
|
import org.junit.Rule;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.rules.TemporaryFolder;
|
import org.junit.rules.TemporaryFolder;
|
||||||
@@ -1069,4 +1043,270 @@ public class XMLTest {
|
|||||||
fail("Expected to be unable to modify the config");
|
fail("Expected to be unable to modify the config");
|
||||||
} catch (Exception ignored) { }
|
} catch (Exception ignored) { }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIndentComplicatedJsonObject(){
|
||||||
|
String str = "{\n" +
|
||||||
|
" \"success\": true,\n" +
|
||||||
|
" \"error\": null,\n" +
|
||||||
|
" \"response\": [\n" +
|
||||||
|
" {\n" +
|
||||||
|
" \"timestamp\": 1664917200,\n" +
|
||||||
|
" \"dateTimeISO\": \"2022-10-05T00:00:00+03:00\",\n" +
|
||||||
|
" \"loc\": {\n" +
|
||||||
|
" \"lat\": 39.91987,\n" +
|
||||||
|
" \"long\": 32.85427\n" +
|
||||||
|
" },\n" +
|
||||||
|
" \"place\": {\n" +
|
||||||
|
" \"name\": \"ankara\",\n" +
|
||||||
|
" \"state\": \"an\",\n" +
|
||||||
|
" \"country\": \"tr\"\n" +
|
||||||
|
" },\n" +
|
||||||
|
" \"profile\": {\n" +
|
||||||
|
" \"tz\": \"Europe/Istanbul\"\n" +
|
||||||
|
" },\n" +
|
||||||
|
" \"sun\": {\n" +
|
||||||
|
" \"rise\": 1664941721,\n" +
|
||||||
|
" \"riseISO\": \"2022-10-05T06:48:41+03:00\",\n" +
|
||||||
|
" \"set\": 1664983521,\n" +
|
||||||
|
" \"setISO\": \"2022-10-05T18:25:21+03:00\",\n" +
|
||||||
|
" \"transit\": 1664962621,\n" +
|
||||||
|
" \"transitISO\": \"2022-10-05T12:37:01+03:00\",\n" +
|
||||||
|
" \"midnightSun\": false,\n" +
|
||||||
|
" \"polarNight\": false,\n" +
|
||||||
|
" \"twilight\": {\n" +
|
||||||
|
" \"civilBegin\": 1664940106,\n" +
|
||||||
|
" \"civilBeginISO\": \"2022-10-05T06:21:46+03:00\",\n" +
|
||||||
|
" \"civilEnd\": 1664985136,\n" +
|
||||||
|
" \"civilEndISO\": \"2022-10-05T18:52:16+03:00\",\n" +
|
||||||
|
" \"nauticalBegin\": 1664938227,\n" +
|
||||||
|
" \"nauticalBeginISO\": \"2022-10-05T05:50:27+03:00\",\n" +
|
||||||
|
" \"nauticalEnd\": 1664987015,\n" +
|
||||||
|
" \"nauticalEndISO\": \"2022-10-05T19:23:35+03:00\",\n" +
|
||||||
|
" \"astronomicalBegin\": 1664936337,\n" +
|
||||||
|
" \"astronomicalBeginISO\": \"2022-10-05T05:18:57+03:00\",\n" +
|
||||||
|
" \"astronomicalEnd\": 1664988905,\n" +
|
||||||
|
" \"astronomicalEndISO\": \"2022-10-05T19:55:05+03:00\"\n" +
|
||||||
|
" }\n" +
|
||||||
|
" },\n" +
|
||||||
|
" \"moon\": {\n" +
|
||||||
|
" \"rise\": 1664976480,\n" +
|
||||||
|
" \"riseISO\": \"2022-10-05T16:28:00+03:00\",\n" +
|
||||||
|
" \"set\": 1664921520,\n" +
|
||||||
|
" \"setISO\": \"2022-10-05T01:12:00+03:00\",\n" +
|
||||||
|
" \"transit\": 1664994240,\n" +
|
||||||
|
" \"transitISO\": \"2022-10-05T21:24:00+03:00\",\n" +
|
||||||
|
" \"underfoot\": 1664949360,\n" +
|
||||||
|
" \"underfootISO\": \"2022-10-05T08:56:00+03:00\",\n" +
|
||||||
|
" \"phase\": {\n" +
|
||||||
|
" \"phase\": 0.3186,\n" +
|
||||||
|
" \"name\": \"waxing gibbous\",\n" +
|
||||||
|
" \"illum\": 71,\n" +
|
||||||
|
" \"age\": 9.41,\n" +
|
||||||
|
" \"angle\": 0.55\n" +
|
||||||
|
" }\n" +
|
||||||
|
" }\n" +
|
||||||
|
" }\n" +
|
||||||
|
" ]\n" +
|
||||||
|
"}" ;
|
||||||
|
JSONObject jsonObject = new JSONObject(str);
|
||||||
|
String actualIndentedXmlString = XML.toString(jsonObject, 1);
|
||||||
|
String expected = "<success>true</success>\n" +
|
||||||
|
"<response>\n" +
|
||||||
|
" <dateTimeISO>2022-10-05T00:00:00+03:00</dateTimeISO>\n" +
|
||||||
|
" <loc>\n" +
|
||||||
|
" <lat>39.91987</lat>\n" +
|
||||||
|
" <long>32.85427</long>\n" +
|
||||||
|
" </loc>\n" +
|
||||||
|
" <moon>\n" +
|
||||||
|
" <phase>\n" +
|
||||||
|
" <phase>0.3186</phase>\n" +
|
||||||
|
" <name>waxing gibbous</name>\n" +
|
||||||
|
" <angle>0.55</angle>\n" +
|
||||||
|
" <illum>71</illum>\n" +
|
||||||
|
" <age>9.41</age>\n" +
|
||||||
|
" </phase>\n" +
|
||||||
|
" <setISO>2022-10-05T01:12:00+03:00</setISO>\n" +
|
||||||
|
" <underfoot>1664949360</underfoot>\n" +
|
||||||
|
" <set>1664921520</set>\n" +
|
||||||
|
" <transit>1664994240</transit>\n" +
|
||||||
|
" <transitISO>2022-10-05T21:24:00+03:00</transitISO>\n" +
|
||||||
|
" <riseISO>2022-10-05T16:28:00+03:00</riseISO>\n" +
|
||||||
|
" <rise>1664976480</rise>\n" +
|
||||||
|
" <underfootISO>2022-10-05T08:56:00+03:00</underfootISO>\n" +
|
||||||
|
" </moon>\n" +
|
||||||
|
" <profile>\n" +
|
||||||
|
" <tz>Europe/Istanbul</tz>\n" +
|
||||||
|
" </profile>\n" +
|
||||||
|
" <place>\n" +
|
||||||
|
" <country>tr</country>\n" +
|
||||||
|
" <name>ankara</name>\n" +
|
||||||
|
" <state>an</state>\n" +
|
||||||
|
" </place>\n" +
|
||||||
|
" <sun>\n" +
|
||||||
|
" <setISO>2022-10-05T18:25:21+03:00</setISO>\n" +
|
||||||
|
" <midnightSun>false</midnightSun>\n" +
|
||||||
|
" <set>1664983521</set>\n" +
|
||||||
|
" <transit>1664962621</transit>\n" +
|
||||||
|
" <polarNight>false</polarNight>\n" +
|
||||||
|
" <transitISO>2022-10-05T12:37:01+03:00</transitISO>\n" +
|
||||||
|
" <riseISO>2022-10-05T06:48:41+03:00</riseISO>\n" +
|
||||||
|
" <rise>1664941721</rise>\n" +
|
||||||
|
" <twilight>\n" +
|
||||||
|
" <civilEnd>1664985136</civilEnd>\n" +
|
||||||
|
" <astronomicalBegin>1664936337</astronomicalBegin>\n" +
|
||||||
|
" <astronomicalEnd>1664988905</astronomicalEnd>\n" +
|
||||||
|
" <astronomicalBeginISO>2022-10-05T05:18:57+03:00</astronomicalBeginISO>\n" +
|
||||||
|
" <civilBegin>1664940106</civilBegin>\n" +
|
||||||
|
" <nauticalEndISO>2022-10-05T19:23:35+03:00</nauticalEndISO>\n" +
|
||||||
|
" <astronomicalEndISO>2022-10-05T19:55:05+03:00</astronomicalEndISO>\n" +
|
||||||
|
" <nauticalBegin>1664938227</nauticalBegin>\n" +
|
||||||
|
" <nauticalEnd>1664987015</nauticalEnd>\n" +
|
||||||
|
" <nauticalBeginISO>2022-10-05T05:50:27+03:00</nauticalBeginISO>\n" +
|
||||||
|
" <civilBeginISO>2022-10-05T06:21:46+03:00</civilBeginISO>\n" +
|
||||||
|
" <civilEndISO>2022-10-05T18:52:16+03:00</civilEndISO>\n" +
|
||||||
|
" </twilight>\n" +
|
||||||
|
" </sun>\n" +
|
||||||
|
" <timestamp>1664917200</timestamp>\n" +
|
||||||
|
"</response>\n" +
|
||||||
|
"<error>null</error>\n";
|
||||||
|
assertEquals(actualIndentedXmlString, expected);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
@Test
|
||||||
|
public void testIndentSimpleJsonObject(){
|
||||||
|
String str = "{ \"employee\": { \n" +
|
||||||
|
" \"name\": \"sonoo\", \n" +
|
||||||
|
" \"salary\": 56000, \n" +
|
||||||
|
" \"married\": true \n" +
|
||||||
|
" }}";
|
||||||
|
JSONObject jsonObject = new JSONObject(str);
|
||||||
|
String actual = XML.toString(jsonObject, "Test", 2);
|
||||||
|
String expected = "<Test>\n" +
|
||||||
|
" <employee>\n" +
|
||||||
|
" <name>sonoo</name>\n" +
|
||||||
|
" <salary>56000</salary>\n" +
|
||||||
|
" <married>true</married>\n" +
|
||||||
|
" </employee>\n" +
|
||||||
|
"</Test>\n";
|
||||||
|
assertEquals(actual, expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIndentSimpleJsonArray(){
|
||||||
|
String str = "[ \n" +
|
||||||
|
" {\"name\":\"Ram\", \"email\":\"Ram@gmail.com\"}, \n" +
|
||||||
|
" {\"name\":\"Bob\", \"email\":\"bob32@gmail.com\"} \n" +
|
||||||
|
"] ";
|
||||||
|
JSONArray jsonObject = new JSONArray(str);
|
||||||
|
String actual = XML.toString(jsonObject, 2);
|
||||||
|
String expected = "<array>\n" +
|
||||||
|
" <name>Ram</name>\n" +
|
||||||
|
" <email>Ram@gmail.com</email>\n" +
|
||||||
|
"</array>\n" +
|
||||||
|
"<array>\n" +
|
||||||
|
" <name>Bob</name>\n" +
|
||||||
|
" <email>bob32@gmail.com</email>\n" +
|
||||||
|
"</array>\n";
|
||||||
|
assertEquals(actual, expected);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIndentComplicatedJsonObjectWithArrayAndWithConfig(){
|
||||||
|
try {
|
||||||
|
InputStream jsonStream = null;
|
||||||
|
try {
|
||||||
|
jsonStream = XMLTest.class.getClassLoader().getResourceAsStream("Issue593.json");
|
||||||
|
final JSONObject object = new JSONObject(new JSONTokener(jsonStream));
|
||||||
|
String actualString = XML.toString(object, null, XMLParserConfiguration.KEEP_STRINGS,2);
|
||||||
|
InputStream xmlStream = null;
|
||||||
|
try {
|
||||||
|
xmlStream = XMLTest.class.getClassLoader().getResourceAsStream("Issue593.xml");
|
||||||
|
int bufferSize = 1024;
|
||||||
|
char[] buffer = new char[bufferSize];
|
||||||
|
StringBuilder expected = new StringBuilder();
|
||||||
|
Reader in = new InputStreamReader(xmlStream, "UTF-8");
|
||||||
|
for (int numRead; (numRead = in.read(buffer, 0, buffer.length)) > 0; ) {
|
||||||
|
expected.append(buffer, 0, numRead);
|
||||||
|
}
|
||||||
|
assertEquals(expected.toString(), actualString.replaceAll("\\n|\\r\\n", System.getProperty("line.separator")));
|
||||||
|
} finally {
|
||||||
|
if (xmlStream != null) {
|
||||||
|
xmlStream.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
if (jsonStream != null) {
|
||||||
|
jsonStream.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
fail("file writer error: " +e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMaxNestingDepthOf42IsRespected() {
|
||||||
|
final String wayTooLongMalformedXML = new String(new char[6000]).replace("\0", "<a>");
|
||||||
|
|
||||||
|
final int maxNestingDepth = 42;
|
||||||
|
|
||||||
|
try {
|
||||||
|
XML.toJSONObject(wayTooLongMalformedXML, XMLParserConfiguration.ORIGINAL.withMaxNestingDepth(maxNestingDepth));
|
||||||
|
|
||||||
|
fail("Expecting a JSONException");
|
||||||
|
} catch (JSONException e) {
|
||||||
|
assertTrue("Wrong throwable thrown: not expecting message <" + e.getMessage() + ">",
|
||||||
|
e.getMessage().startsWith("Maximum nesting depth of " + maxNestingDepth));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMaxNestingDepthIsRespectedWithValidXML() {
|
||||||
|
final String perfectlyFineXML = "<Test>\n" +
|
||||||
|
" <employee>\n" +
|
||||||
|
" <name>sonoo</name>\n" +
|
||||||
|
" <salary>56000</salary>\n" +
|
||||||
|
" <married>true</married>\n" +
|
||||||
|
" </employee>\n" +
|
||||||
|
"</Test>\n";
|
||||||
|
|
||||||
|
final int maxNestingDepth = 1;
|
||||||
|
|
||||||
|
try {
|
||||||
|
XML.toJSONObject(perfectlyFineXML, XMLParserConfiguration.ORIGINAL.withMaxNestingDepth(maxNestingDepth));
|
||||||
|
|
||||||
|
fail("Expecting a JSONException");
|
||||||
|
} catch (JSONException e) {
|
||||||
|
assertTrue("Wrong throwable thrown: not expecting message <" + e.getMessage() + ">",
|
||||||
|
e.getMessage().startsWith("Maximum nesting depth of " + maxNestingDepth));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMaxNestingDepthWithValidFittingXML() {
|
||||||
|
final String perfectlyFineXML = "<Test>\n" +
|
||||||
|
" <employee>\n" +
|
||||||
|
" <name>sonoo</name>\n" +
|
||||||
|
" <salary>56000</salary>\n" +
|
||||||
|
" <married>true</married>\n" +
|
||||||
|
" </employee>\n" +
|
||||||
|
"</Test>\n";
|
||||||
|
|
||||||
|
final int maxNestingDepth = 3;
|
||||||
|
|
||||||
|
try {
|
||||||
|
XML.toJSONObject(perfectlyFineXML, XMLParserConfiguration.ORIGINAL.withMaxNestingDepth(maxNestingDepth));
|
||||||
|
} catch (JSONException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
fail("XML document should be parsed as its maximum depth fits the maxNestingDepth " +
|
||||||
|
"parameter of the XMLParserConfiguration used");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
704
src/test/resources/Issue593.json
Normal file
704
src/test/resources/Issue593.json
Normal file
@@ -0,0 +1,704 @@
|
|||||||
|
{
|
||||||
|
"success": true,
|
||||||
|
"error": null,
|
||||||
|
"response": [
|
||||||
|
{
|
||||||
|
"loc": {
|
||||||
|
"long": 31.25,
|
||||||
|
"lat": 30.063
|
||||||
|
},
|
||||||
|
"interval": "day",
|
||||||
|
"place": {
|
||||||
|
"name": "cairo",
|
||||||
|
"state": "qh",
|
||||||
|
"country": "eg"
|
||||||
|
},
|
||||||
|
"periods": [
|
||||||
|
{
|
||||||
|
"timestamp": 1665032400,
|
||||||
|
"validTime": "2022-10-06T07:00:00+02:00",
|
||||||
|
"dateTimeISO": "2022-10-06T07:00:00+02:00",
|
||||||
|
"maxTempC": 32,
|
||||||
|
"maxTempF": 90,
|
||||||
|
"minTempC": 19,
|
||||||
|
"minTempF": 66,
|
||||||
|
"avgTempC": 25,
|
||||||
|
"avgTempF": 78,
|
||||||
|
"tempC": null,
|
||||||
|
"tempF": null,
|
||||||
|
"maxFeelslikeC": 32,
|
||||||
|
"maxFeelslikeF": 89,
|
||||||
|
"minFeelslikeC": 21,
|
||||||
|
"minFeelslikeF": 70,
|
||||||
|
"avgFeelslikeC": 26,
|
||||||
|
"avgFeelslikeF": 80,
|
||||||
|
"feelslikeC": 21,
|
||||||
|
"feelslikeF": 70,
|
||||||
|
"maxDewpointC": 17,
|
||||||
|
"maxDewpointF": 63,
|
||||||
|
"minDewpointC": 11,
|
||||||
|
"minDewpointF": 52,
|
||||||
|
"avgDewpointC": 14,
|
||||||
|
"avgDewpointF": 58,
|
||||||
|
"dewpointC": 17,
|
||||||
|
"dewpointF": 63,
|
||||||
|
"maxHumidity": 77,
|
||||||
|
"minHumidity": 29,
|
||||||
|
"humidity": 77,
|
||||||
|
"pop": 0,
|
||||||
|
"precipMM": 0,
|
||||||
|
"precipIN": 0,
|
||||||
|
"iceaccum": null,
|
||||||
|
"iceaccumMM": null,
|
||||||
|
"iceaccumIN": null,
|
||||||
|
"snowCM": 0,
|
||||||
|
"snowIN": 0,
|
||||||
|
"pressureMB": 1015,
|
||||||
|
"pressureIN": 29.97,
|
||||||
|
"windDir": "N",
|
||||||
|
"windDirDEG": 353,
|
||||||
|
"windSpeedKTS": 5,
|
||||||
|
"windSpeedKPH": 9,
|
||||||
|
"windSpeedMPH": 6,
|
||||||
|
"windGustKTS": 21,
|
||||||
|
"windGustKPH": 40,
|
||||||
|
"windGustMPH": 25,
|
||||||
|
"windDirMax": "NNW",
|
||||||
|
"windDirMaxDEG": 342,
|
||||||
|
"windSpeedMaxKTS": 9,
|
||||||
|
"windSpeedMaxKPH": 16,
|
||||||
|
"windSpeedMaxMPH": 10,
|
||||||
|
"windDirMin": "N",
|
||||||
|
"windDirMinDEG": 353,
|
||||||
|
"windSpeedMinKTS": 1,
|
||||||
|
"windSpeedMinKPH": 2,
|
||||||
|
"windSpeedMinMPH": 1,
|
||||||
|
"windDir80m": "N",
|
||||||
|
"windDir80mDEG": 11,
|
||||||
|
"windSpeed80mKTS": 12,
|
||||||
|
"windSpeed80mKPH": 22,
|
||||||
|
"windSpeed80mMPH": 13,
|
||||||
|
"windGust80mKTS": 22,
|
||||||
|
"windGust80mKPH": 41,
|
||||||
|
"windGust80mMPH": 25,
|
||||||
|
"windDirMax80m": "NNW",
|
||||||
|
"windDirMax80mDEG": 343,
|
||||||
|
"windSpeedMax80mKTS": 22,
|
||||||
|
"windSpeedMax80mKPH": 41,
|
||||||
|
"windSpeedMax80mMPH": 25,
|
||||||
|
"windDirMin80m": "E",
|
||||||
|
"windDirMin80mDEG": 95,
|
||||||
|
"windSpeedMin80mKTS": 8,
|
||||||
|
"windSpeedMin80mKPH": 15,
|
||||||
|
"windSpeedMin80mMPH": 10,
|
||||||
|
"sky": 22,
|
||||||
|
"cloudsCoded": "FW",
|
||||||
|
"weather": "Mostly Sunny",
|
||||||
|
"weatherCoded": [],
|
||||||
|
"weatherPrimary": "Mostly Sunny",
|
||||||
|
"weatherPrimaryCoded": "::FW",
|
||||||
|
"icon": "fair.png",
|
||||||
|
"visibilityKM": 24.135,
|
||||||
|
"visibilityMI": 15,
|
||||||
|
"uvi": 6,
|
||||||
|
"solradWM2": 5608,
|
||||||
|
"solradMinWM2": 0,
|
||||||
|
"solradMaxWM2": 778,
|
||||||
|
"isDay": true,
|
||||||
|
"maxCoverage": "",
|
||||||
|
"sunrise": 1665028274,
|
||||||
|
"sunset": 1665070502,
|
||||||
|
"sunriseISO": "2022-10-06T05:51:14+02:00",
|
||||||
|
"sunsetISO": "2022-10-06T17:35:02+02:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1665118800,
|
||||||
|
"validTime": "2022-10-07T07:00:00+02:00",
|
||||||
|
"dateTimeISO": "2022-10-07T07:00:00+02:00",
|
||||||
|
"maxTempC": 30,
|
||||||
|
"maxTempF": 86,
|
||||||
|
"minTempC": 19,
|
||||||
|
"minTempF": 66,
|
||||||
|
"avgTempC": 24,
|
||||||
|
"avgTempF": 76,
|
||||||
|
"tempC": null,
|
||||||
|
"tempF": null,
|
||||||
|
"maxFeelslikeC": 29,
|
||||||
|
"maxFeelslikeF": 85,
|
||||||
|
"minFeelslikeC": 19,
|
||||||
|
"minFeelslikeF": 67,
|
||||||
|
"avgFeelslikeC": 24,
|
||||||
|
"avgFeelslikeF": 76,
|
||||||
|
"feelslikeC": 19,
|
||||||
|
"feelslikeF": 67,
|
||||||
|
"maxDewpointC": 15,
|
||||||
|
"maxDewpointF": 60,
|
||||||
|
"minDewpointC": 10,
|
||||||
|
"minDewpointF": 50,
|
||||||
|
"avgDewpointC": 12,
|
||||||
|
"avgDewpointF": 54,
|
||||||
|
"dewpointC": 15,
|
||||||
|
"dewpointF": 60,
|
||||||
|
"maxHumidity": 77,
|
||||||
|
"minHumidity": 30,
|
||||||
|
"humidity": 77,
|
||||||
|
"pop": 0,
|
||||||
|
"precipMM": 0,
|
||||||
|
"precipIN": 0,
|
||||||
|
"iceaccum": null,
|
||||||
|
"iceaccumMM": null,
|
||||||
|
"iceaccumIN": null,
|
||||||
|
"snowCM": 0,
|
||||||
|
"snowIN": 0,
|
||||||
|
"pressureMB": 1014,
|
||||||
|
"pressureIN": 29.95,
|
||||||
|
"windDir": "NW",
|
||||||
|
"windDirDEG": 325,
|
||||||
|
"windSpeedKTS": 1,
|
||||||
|
"windSpeedKPH": 2,
|
||||||
|
"windSpeedMPH": 1,
|
||||||
|
"windGustKTS": 16,
|
||||||
|
"windGustKPH": 29,
|
||||||
|
"windGustMPH": 18,
|
||||||
|
"windDirMax": "WNW",
|
||||||
|
"windDirMaxDEG": 298,
|
||||||
|
"windSpeedMaxKTS": 7,
|
||||||
|
"windSpeedMaxKPH": 13,
|
||||||
|
"windSpeedMaxMPH": 8,
|
||||||
|
"windDirMin": "NW",
|
||||||
|
"windDirMinDEG": 325,
|
||||||
|
"windSpeedMinKTS": 1,
|
||||||
|
"windSpeedMinKPH": 2,
|
||||||
|
"windSpeedMinMPH": 1,
|
||||||
|
"windDir80m": "NNW",
|
||||||
|
"windDir80mDEG": 347,
|
||||||
|
"windSpeed80mKTS": 6,
|
||||||
|
"windSpeed80mKPH": 10,
|
||||||
|
"windSpeed80mMPH": 6,
|
||||||
|
"windGust80mKTS": 20,
|
||||||
|
"windGust80mKPH": 37,
|
||||||
|
"windGust80mMPH": 23,
|
||||||
|
"windDirMax80m": "NW",
|
||||||
|
"windDirMax80mDEG": 316,
|
||||||
|
"windSpeedMax80mKTS": 20,
|
||||||
|
"windSpeedMax80mKPH": 37,
|
||||||
|
"windSpeedMax80mMPH": 23,
|
||||||
|
"windDirMin80m": "NNW",
|
||||||
|
"windDirMin80mDEG": 347,
|
||||||
|
"windSpeedMin80mKTS": 6,
|
||||||
|
"windSpeedMin80mKPH": 10,
|
||||||
|
"windSpeedMin80mMPH": 6,
|
||||||
|
"sky": 30,
|
||||||
|
"cloudsCoded": "FW",
|
||||||
|
"weather": "Mostly Sunny",
|
||||||
|
"weatherCoded": [],
|
||||||
|
"weatherPrimary": "Mostly Sunny",
|
||||||
|
"weatherPrimaryCoded": "::FW",
|
||||||
|
"icon": "fair.png",
|
||||||
|
"visibilityKM": 24.135,
|
||||||
|
"visibilityMI": 15,
|
||||||
|
"uvi": 6,
|
||||||
|
"solradWM2": 5486,
|
||||||
|
"solradMinWM2": 0,
|
||||||
|
"solradMaxWM2": 742,
|
||||||
|
"isDay": true,
|
||||||
|
"maxCoverage": "",
|
||||||
|
"sunrise": 1665114710,
|
||||||
|
"sunset": 1665156831,
|
||||||
|
"sunriseISO": "2022-10-07T05:51:50+02:00",
|
||||||
|
"sunsetISO": "2022-10-07T17:33:51+02:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1665205200,
|
||||||
|
"validTime": "2022-10-08T07:00:00+02:00",
|
||||||
|
"dateTimeISO": "2022-10-08T07:00:00+02:00",
|
||||||
|
"maxTempC": 30,
|
||||||
|
"maxTempF": 87,
|
||||||
|
"minTempC": 19,
|
||||||
|
"minTempF": 66,
|
||||||
|
"avgTempC": 25,
|
||||||
|
"avgTempF": 76,
|
||||||
|
"tempC": null,
|
||||||
|
"tempF": null,
|
||||||
|
"maxFeelslikeC": 30,
|
||||||
|
"maxFeelslikeF": 86,
|
||||||
|
"minFeelslikeC": 19,
|
||||||
|
"minFeelslikeF": 67,
|
||||||
|
"avgFeelslikeC": 25,
|
||||||
|
"avgFeelslikeF": 76,
|
||||||
|
"feelslikeC": 19,
|
||||||
|
"feelslikeF": 67,
|
||||||
|
"maxDewpointC": 15,
|
||||||
|
"maxDewpointF": 59,
|
||||||
|
"minDewpointC": 11,
|
||||||
|
"minDewpointF": 52,
|
||||||
|
"avgDewpointC": 13,
|
||||||
|
"avgDewpointF": 56,
|
||||||
|
"dewpointC": 15,
|
||||||
|
"dewpointF": 59,
|
||||||
|
"maxHumidity": 76,
|
||||||
|
"minHumidity": 32,
|
||||||
|
"humidity": 76,
|
||||||
|
"pop": 0,
|
||||||
|
"precipMM": 0,
|
||||||
|
"precipIN": 0,
|
||||||
|
"iceaccum": null,
|
||||||
|
"iceaccumMM": null,
|
||||||
|
"iceaccumIN": null,
|
||||||
|
"snowCM": 0,
|
||||||
|
"snowIN": 0,
|
||||||
|
"pressureMB": 1014,
|
||||||
|
"pressureIN": 29.94,
|
||||||
|
"windDir": "NNE",
|
||||||
|
"windDirDEG": 21,
|
||||||
|
"windSpeedKTS": 1,
|
||||||
|
"windSpeedKPH": 2,
|
||||||
|
"windSpeedMPH": 1,
|
||||||
|
"windGustKTS": 17,
|
||||||
|
"windGustKPH": 32,
|
||||||
|
"windGustMPH": 20,
|
||||||
|
"windDirMax": "WNW",
|
||||||
|
"windDirMaxDEG": 301,
|
||||||
|
"windSpeedMaxKTS": 7,
|
||||||
|
"windSpeedMaxKPH": 13,
|
||||||
|
"windSpeedMaxMPH": 8,
|
||||||
|
"windDirMin": "NNE",
|
||||||
|
"windDirMinDEG": 21,
|
||||||
|
"windSpeedMinKTS": 1,
|
||||||
|
"windSpeedMinKPH": 2,
|
||||||
|
"windSpeedMinMPH": 1,
|
||||||
|
"windDir80m": "NW",
|
||||||
|
"windDir80mDEG": 309,
|
||||||
|
"windSpeed80mKTS": 5,
|
||||||
|
"windSpeed80mKPH": 9,
|
||||||
|
"windSpeed80mMPH": 5,
|
||||||
|
"windGust80mKTS": 17,
|
||||||
|
"windGust80mKPH": 31,
|
||||||
|
"windGust80mMPH": 19,
|
||||||
|
"windDirMax80m": "NW",
|
||||||
|
"windDirMax80mDEG": 322,
|
||||||
|
"windSpeedMax80mKTS": 17,
|
||||||
|
"windSpeedMax80mKPH": 31,
|
||||||
|
"windSpeedMax80mMPH": 19,
|
||||||
|
"windDirMin80m": "NW",
|
||||||
|
"windDirMin80mDEG": 309,
|
||||||
|
"windSpeedMin80mKTS": 5,
|
||||||
|
"windSpeedMin80mKPH": 9,
|
||||||
|
"windSpeedMin80mMPH": 5,
|
||||||
|
"sky": 47,
|
||||||
|
"cloudsCoded": "SC",
|
||||||
|
"weather": "Partly Cloudy",
|
||||||
|
"weatherCoded": [],
|
||||||
|
"weatherPrimary": "Partly Cloudy",
|
||||||
|
"weatherPrimaryCoded": "::SC",
|
||||||
|
"icon": "pcloudy.png",
|
||||||
|
"visibilityKM": 24.135,
|
||||||
|
"visibilityMI": 15,
|
||||||
|
"uvi": 7,
|
||||||
|
"solradWM2": 4785,
|
||||||
|
"solradMinWM2": 0,
|
||||||
|
"solradMaxWM2": 682,
|
||||||
|
"isDay": true,
|
||||||
|
"maxCoverage": "",
|
||||||
|
"sunrise": 1665201146,
|
||||||
|
"sunset": 1665243161,
|
||||||
|
"sunriseISO": "2022-10-08T05:52:26+02:00",
|
||||||
|
"sunsetISO": "2022-10-08T17:32:41+02:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1665291600,
|
||||||
|
"validTime": "2022-10-09T07:00:00+02:00",
|
||||||
|
"dateTimeISO": "2022-10-09T07:00:00+02:00",
|
||||||
|
"maxTempC": 31,
|
||||||
|
"maxTempF": 87,
|
||||||
|
"minTempC": 19,
|
||||||
|
"minTempF": 67,
|
||||||
|
"avgTempC": 25,
|
||||||
|
"avgTempF": 77,
|
||||||
|
"tempC": null,
|
||||||
|
"tempF": null,
|
||||||
|
"maxFeelslikeC": 30,
|
||||||
|
"maxFeelslikeF": 86,
|
||||||
|
"minFeelslikeC": 20,
|
||||||
|
"minFeelslikeF": 67,
|
||||||
|
"avgFeelslikeC": 25,
|
||||||
|
"avgFeelslikeF": 77,
|
||||||
|
"feelslikeC": 20,
|
||||||
|
"feelslikeF": 67,
|
||||||
|
"maxDewpointC": 17,
|
||||||
|
"maxDewpointF": 63,
|
||||||
|
"minDewpointC": 11,
|
||||||
|
"minDewpointF": 52,
|
||||||
|
"avgDewpointC": 14,
|
||||||
|
"avgDewpointF": 57,
|
||||||
|
"dewpointC": 17,
|
||||||
|
"dewpointF": 63,
|
||||||
|
"maxHumidity": 86,
|
||||||
|
"minHumidity": 31,
|
||||||
|
"humidity": 86,
|
||||||
|
"pop": 0,
|
||||||
|
"precipMM": 0,
|
||||||
|
"precipIN": 0,
|
||||||
|
"iceaccum": null,
|
||||||
|
"iceaccumMM": null,
|
||||||
|
"iceaccumIN": null,
|
||||||
|
"snowCM": 0,
|
||||||
|
"snowIN": 0,
|
||||||
|
"pressureMB": 1016,
|
||||||
|
"pressureIN": 29.99,
|
||||||
|
"windDir": "N",
|
||||||
|
"windDirDEG": 356,
|
||||||
|
"windSpeedKTS": 2,
|
||||||
|
"windSpeedKPH": 4,
|
||||||
|
"windSpeedMPH": 2,
|
||||||
|
"windGustKTS": 19,
|
||||||
|
"windGustKPH": 36,
|
||||||
|
"windGustMPH": 22,
|
||||||
|
"windDirMax": "NNW",
|
||||||
|
"windDirMaxDEG": 343,
|
||||||
|
"windSpeedMaxKTS": 8,
|
||||||
|
"windSpeedMaxKPH": 14,
|
||||||
|
"windSpeedMaxMPH": 9,
|
||||||
|
"windDirMin": "N",
|
||||||
|
"windDirMinDEG": 356,
|
||||||
|
"windSpeedMinKTS": 2,
|
||||||
|
"windSpeedMinKPH": 4,
|
||||||
|
"windSpeedMinMPH": 2,
|
||||||
|
"windDir80m": "NW",
|
||||||
|
"windDir80mDEG": 316,
|
||||||
|
"windSpeed80mKTS": 5,
|
||||||
|
"windSpeed80mKPH": 9,
|
||||||
|
"windSpeed80mMPH": 6,
|
||||||
|
"windGust80mKTS": 20,
|
||||||
|
"windGust80mKPH": 36,
|
||||||
|
"windGust80mMPH": 23,
|
||||||
|
"windDirMax80m": "N",
|
||||||
|
"windDirMax80mDEG": 354,
|
||||||
|
"windSpeedMax80mKTS": 20,
|
||||||
|
"windSpeedMax80mKPH": 36,
|
||||||
|
"windSpeedMax80mMPH": 23,
|
||||||
|
"windDirMin80m": "NW",
|
||||||
|
"windDirMin80mDEG": 316,
|
||||||
|
"windSpeedMin80mKTS": 5,
|
||||||
|
"windSpeedMin80mKPH": 9,
|
||||||
|
"windSpeedMin80mMPH": 6,
|
||||||
|
"sky": 47,
|
||||||
|
"cloudsCoded": "SC",
|
||||||
|
"weather": "Partly Cloudy",
|
||||||
|
"weatherCoded": [],
|
||||||
|
"weatherPrimary": "Partly Cloudy",
|
||||||
|
"weatherPrimaryCoded": "::SC",
|
||||||
|
"icon": "pcloudy.png",
|
||||||
|
"visibilityKM": 24.135,
|
||||||
|
"visibilityMI": 15,
|
||||||
|
"uvi": 7,
|
||||||
|
"solradWM2": 4768,
|
||||||
|
"solradMinWM2": 0,
|
||||||
|
"solradMaxWM2": 726,
|
||||||
|
"isDay": true,
|
||||||
|
"maxCoverage": "",
|
||||||
|
"sunrise": 1665287583,
|
||||||
|
"sunset": 1665329491,
|
||||||
|
"sunriseISO": "2022-10-09T05:53:03+02:00",
|
||||||
|
"sunsetISO": "2022-10-09T17:31:31+02:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1665378000,
|
||||||
|
"validTime": "2022-10-10T07:00:00+02:00",
|
||||||
|
"dateTimeISO": "2022-10-10T07:00:00+02:00",
|
||||||
|
"maxTempC": 31,
|
||||||
|
"maxTempF": 87,
|
||||||
|
"minTempC": 21,
|
||||||
|
"minTempF": 70,
|
||||||
|
"avgTempC": 26,
|
||||||
|
"avgTempF": 78,
|
||||||
|
"tempC": null,
|
||||||
|
"tempF": null,
|
||||||
|
"maxFeelslikeC": 30,
|
||||||
|
"maxFeelslikeF": 86,
|
||||||
|
"minFeelslikeC": 21,
|
||||||
|
"minFeelslikeF": 69,
|
||||||
|
"avgFeelslikeC": 25,
|
||||||
|
"avgFeelslikeF": 78,
|
||||||
|
"feelslikeC": 21,
|
||||||
|
"feelslikeF": 69,
|
||||||
|
"maxDewpointC": 16,
|
||||||
|
"maxDewpointF": 61,
|
||||||
|
"minDewpointC": 13,
|
||||||
|
"minDewpointF": 55,
|
||||||
|
"avgDewpointC": 14,
|
||||||
|
"avgDewpointF": 58,
|
||||||
|
"dewpointC": 16,
|
||||||
|
"dewpointF": 61,
|
||||||
|
"maxHumidity": 75,
|
||||||
|
"minHumidity": 35,
|
||||||
|
"humidity": 75,
|
||||||
|
"pop": 0,
|
||||||
|
"precipMM": 0,
|
||||||
|
"precipIN": 0,
|
||||||
|
"iceaccum": null,
|
||||||
|
"iceaccumMM": null,
|
||||||
|
"iceaccumIN": null,
|
||||||
|
"snowCM": 0,
|
||||||
|
"snowIN": 0,
|
||||||
|
"pressureMB": 1017,
|
||||||
|
"pressureIN": 30.03,
|
||||||
|
"windDir": "N",
|
||||||
|
"windDirDEG": 358,
|
||||||
|
"windSpeedKTS": 2,
|
||||||
|
"windSpeedKPH": 4,
|
||||||
|
"windSpeedMPH": 2,
|
||||||
|
"windGustKTS": 16,
|
||||||
|
"windGustKPH": 30,
|
||||||
|
"windGustMPH": 19,
|
||||||
|
"windDirMax": "N",
|
||||||
|
"windDirMaxDEG": 10,
|
||||||
|
"windSpeedMaxKTS": 8,
|
||||||
|
"windSpeedMaxKPH": 15,
|
||||||
|
"windSpeedMaxMPH": 9,
|
||||||
|
"windDirMin": "N",
|
||||||
|
"windDirMinDEG": 358,
|
||||||
|
"windSpeedMinKTS": 2,
|
||||||
|
"windSpeedMinKPH": 4,
|
||||||
|
"windSpeedMinMPH": 2,
|
||||||
|
"windDir80m": "N",
|
||||||
|
"windDir80mDEG": 8,
|
||||||
|
"windSpeed80mKTS": 7,
|
||||||
|
"windSpeed80mKPH": 13,
|
||||||
|
"windSpeed80mMPH": 8,
|
||||||
|
"windGust80mKTS": 19,
|
||||||
|
"windGust80mKPH": 36,
|
||||||
|
"windGust80mMPH": 22,
|
||||||
|
"windDirMax80m": "N",
|
||||||
|
"windDirMax80mDEG": 10,
|
||||||
|
"windSpeedMax80mKTS": 19,
|
||||||
|
"windSpeedMax80mKPH": 36,
|
||||||
|
"windSpeedMax80mMPH": 22,
|
||||||
|
"windDirMin80m": "E",
|
||||||
|
"windDirMin80mDEG": 91,
|
||||||
|
"windSpeedMin80mKTS": 7,
|
||||||
|
"windSpeedMin80mKPH": 13,
|
||||||
|
"windSpeedMin80mMPH": 8,
|
||||||
|
"sky": 64,
|
||||||
|
"cloudsCoded": "SC",
|
||||||
|
"weather": "Partly Cloudy",
|
||||||
|
"weatherCoded": [],
|
||||||
|
"weatherPrimary": "Partly Cloudy",
|
||||||
|
"weatherPrimaryCoded": "::SC",
|
||||||
|
"icon": "pcloudy.png",
|
||||||
|
"visibilityKM": 24.135,
|
||||||
|
"visibilityMI": 15,
|
||||||
|
"uvi": 6,
|
||||||
|
"solradWM2": 4494,
|
||||||
|
"solradMinWM2": 0,
|
||||||
|
"solradMaxWM2": 597,
|
||||||
|
"isDay": true,
|
||||||
|
"maxCoverage": "",
|
||||||
|
"sunrise": 1665374020,
|
||||||
|
"sunset": 1665415821,
|
||||||
|
"sunriseISO": "2022-10-10T05:53:40+02:00",
|
||||||
|
"sunsetISO": "2022-10-10T17:30:21+02:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1665464400,
|
||||||
|
"validTime": "2022-10-11T07:00:00+02:00",
|
||||||
|
"dateTimeISO": "2022-10-11T07:00:00+02:00",
|
||||||
|
"maxTempC": 31,
|
||||||
|
"maxTempF": 87,
|
||||||
|
"minTempC": 21,
|
||||||
|
"minTempF": 70,
|
||||||
|
"avgTempC": 26,
|
||||||
|
"avgTempF": 78,
|
||||||
|
"tempC": null,
|
||||||
|
"tempF": null,
|
||||||
|
"maxFeelslikeC": 31,
|
||||||
|
"maxFeelslikeF": 87,
|
||||||
|
"minFeelslikeC": 22,
|
||||||
|
"minFeelslikeF": 72,
|
||||||
|
"avgFeelslikeC": 26,
|
||||||
|
"avgFeelslikeF": 79,
|
||||||
|
"feelslikeC": 22,
|
||||||
|
"feelslikeF": 72,
|
||||||
|
"maxDewpointC": 17,
|
||||||
|
"maxDewpointF": 62,
|
||||||
|
"minDewpointC": 11,
|
||||||
|
"minDewpointF": 51,
|
||||||
|
"avgDewpointC": 13,
|
||||||
|
"avgDewpointF": 55,
|
||||||
|
"dewpointC": 17,
|
||||||
|
"dewpointF": 62,
|
||||||
|
"maxHumidity": 71,
|
||||||
|
"minHumidity": 30,
|
||||||
|
"humidity": 71,
|
||||||
|
"pop": 0,
|
||||||
|
"precipMM": 0,
|
||||||
|
"precipIN": 0,
|
||||||
|
"iceaccum": null,
|
||||||
|
"iceaccumMM": null,
|
||||||
|
"iceaccumIN": null,
|
||||||
|
"snowCM": 0,
|
||||||
|
"snowIN": 0,
|
||||||
|
"pressureMB": 1015,
|
||||||
|
"pressureIN": 29.98,
|
||||||
|
"windDir": "NNE",
|
||||||
|
"windDirDEG": 13,
|
||||||
|
"windSpeedKTS": 8,
|
||||||
|
"windSpeedKPH": 15,
|
||||||
|
"windSpeedMPH": 9,
|
||||||
|
"windGustKTS": 15,
|
||||||
|
"windGustKPH": 28,
|
||||||
|
"windGustMPH": 17,
|
||||||
|
"windDirMax": "NNE",
|
||||||
|
"windDirMaxDEG": 28,
|
||||||
|
"windSpeedMaxKTS": 15,
|
||||||
|
"windSpeedMaxKPH": 28,
|
||||||
|
"windSpeedMaxMPH": 18,
|
||||||
|
"windDirMin": "NNE",
|
||||||
|
"windDirMinDEG": 14,
|
||||||
|
"windSpeedMinKTS": 7,
|
||||||
|
"windSpeedMinKPH": 14,
|
||||||
|
"windSpeedMinMPH": 8,
|
||||||
|
"windDir80m": "NNE",
|
||||||
|
"windDir80mDEG": 16,
|
||||||
|
"windSpeed80mKTS": 10,
|
||||||
|
"windSpeed80mKPH": 19,
|
||||||
|
"windSpeed80mMPH": 12,
|
||||||
|
"windGust80mKTS": 17,
|
||||||
|
"windGust80mKPH": 31,
|
||||||
|
"windGust80mMPH": 19,
|
||||||
|
"windDirMax80m": "NNE",
|
||||||
|
"windDirMax80mDEG": 28,
|
||||||
|
"windSpeedMax80mKTS": 17,
|
||||||
|
"windSpeedMax80mKPH": 31,
|
||||||
|
"windSpeedMax80mMPH": 19,
|
||||||
|
"windDirMin80m": "NNE",
|
||||||
|
"windDirMin80mDEG": 13,
|
||||||
|
"windSpeedMin80mKTS": 9,
|
||||||
|
"windSpeedMin80mKPH": 18,
|
||||||
|
"windSpeedMin80mMPH": 11,
|
||||||
|
"sky": 0,
|
||||||
|
"cloudsCoded": "CL",
|
||||||
|
"weather": "Sunny",
|
||||||
|
"weatherCoded": [],
|
||||||
|
"weatherPrimary": "Sunny",
|
||||||
|
"weatherPrimaryCoded": "::CL",
|
||||||
|
"icon": "sunny.png",
|
||||||
|
"visibilityKM": 24.135,
|
||||||
|
"visibilityMI": 15,
|
||||||
|
"uvi": null,
|
||||||
|
"solradWM2": 5450,
|
||||||
|
"solradMinWM2": 0,
|
||||||
|
"solradMaxWM2": 758,
|
||||||
|
"isDay": true,
|
||||||
|
"maxCoverage": "",
|
||||||
|
"sunrise": 1665460458,
|
||||||
|
"sunset": 1665502153,
|
||||||
|
"sunriseISO": "2022-10-11T05:54:18+02:00",
|
||||||
|
"sunsetISO": "2022-10-11T17:29:13+02:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1665550800,
|
||||||
|
"validTime": "2022-10-12T07:00:00+02:00",
|
||||||
|
"dateTimeISO": "2022-10-12T07:00:00+02:00",
|
||||||
|
"maxTempC": 31,
|
||||||
|
"maxTempF": 88,
|
||||||
|
"minTempC": 21,
|
||||||
|
"minTempF": 69,
|
||||||
|
"avgTempC": 26,
|
||||||
|
"avgTempF": 79,
|
||||||
|
"tempC": null,
|
||||||
|
"tempF": null,
|
||||||
|
"maxFeelslikeC": 31,
|
||||||
|
"maxFeelslikeF": 88,
|
||||||
|
"minFeelslikeC": 22,
|
||||||
|
"minFeelslikeF": 72,
|
||||||
|
"avgFeelslikeC": 26,
|
||||||
|
"avgFeelslikeF": 80,
|
||||||
|
"feelslikeC": 22,
|
||||||
|
"feelslikeF": 72,
|
||||||
|
"maxDewpointC": 16,
|
||||||
|
"maxDewpointF": 60,
|
||||||
|
"minDewpointC": 11,
|
||||||
|
"minDewpointF": 51,
|
||||||
|
"avgDewpointC": 13,
|
||||||
|
"avgDewpointF": 55,
|
||||||
|
"dewpointC": 16,
|
||||||
|
"dewpointF": 60,
|
||||||
|
"maxHumidity": 68,
|
||||||
|
"minHumidity": 29,
|
||||||
|
"humidity": 68,
|
||||||
|
"pop": 0,
|
||||||
|
"precipMM": 0,
|
||||||
|
"precipIN": 0,
|
||||||
|
"iceaccum": null,
|
||||||
|
"iceaccumMM": null,
|
||||||
|
"iceaccumIN": null,
|
||||||
|
"snowCM": 0,
|
||||||
|
"snowIN": 0,
|
||||||
|
"pressureMB": 1014,
|
||||||
|
"pressureIN": 29.95,
|
||||||
|
"windDir": "NNE",
|
||||||
|
"windDirDEG": 12,
|
||||||
|
"windSpeedKTS": 8,
|
||||||
|
"windSpeedKPH": 15,
|
||||||
|
"windSpeedMPH": 9,
|
||||||
|
"windGustKTS": 15,
|
||||||
|
"windGustKPH": 28,
|
||||||
|
"windGustMPH": 17,
|
||||||
|
"windDirMax": "E",
|
||||||
|
"windDirMaxDEG": 96,
|
||||||
|
"windSpeedMaxKTS": 14,
|
||||||
|
"windSpeedMaxKPH": 26,
|
||||||
|
"windSpeedMaxMPH": 16,
|
||||||
|
"windDirMin": "NNE",
|
||||||
|
"windDirMinDEG": 12,
|
||||||
|
"windSpeedMinKTS": 7,
|
||||||
|
"windSpeedMinKPH": 13,
|
||||||
|
"windSpeedMinMPH": 8,
|
||||||
|
"windDir80m": "NNE",
|
||||||
|
"windDir80mDEG": 15,
|
||||||
|
"windSpeed80mKTS": 10,
|
||||||
|
"windSpeed80mKPH": 19,
|
||||||
|
"windSpeed80mMPH": 12,
|
||||||
|
"windGust80mKTS": 18,
|
||||||
|
"windGust80mKPH": 33,
|
||||||
|
"windGust80mMPH": 21,
|
||||||
|
"windDirMax80m": "E",
|
||||||
|
"windDirMax80mDEG": 96,
|
||||||
|
"windSpeedMax80mKTS": 18,
|
||||||
|
"windSpeedMax80mKPH": 33,
|
||||||
|
"windSpeedMax80mMPH": 21,
|
||||||
|
"windDirMin80m": "NNE",
|
||||||
|
"windDirMin80mDEG": 15,
|
||||||
|
"windSpeedMin80mKTS": 10,
|
||||||
|
"windSpeedMin80mKPH": 18,
|
||||||
|
"windSpeedMin80mMPH": 11,
|
||||||
|
"sky": 27,
|
||||||
|
"cloudsCoded": "FW",
|
||||||
|
"weather": "Mostly Sunny",
|
||||||
|
"weatherCoded": [],
|
||||||
|
"weatherPrimary": "Mostly Sunny",
|
||||||
|
"weatherPrimaryCoded": "::FW",
|
||||||
|
"icon": "fair.png",
|
||||||
|
"visibilityKM": 24.135,
|
||||||
|
"visibilityMI": 15,
|
||||||
|
"uvi": null,
|
||||||
|
"solradWM2": 4740,
|
||||||
|
"solradMinWM2": 0,
|
||||||
|
"solradMaxWM2": 743,
|
||||||
|
"isDay": true,
|
||||||
|
"maxCoverage": "",
|
||||||
|
"sunrise": 1665546895,
|
||||||
|
"sunset": 1665588484,
|
||||||
|
"sunriseISO": "2022-10-12T05:54:55+02:00",
|
||||||
|
"sunsetISO": "2022-10-12T17:28:04+02:00"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"profile": {
|
||||||
|
"tz": "Africa/Cairo",
|
||||||
|
"elevM": 23,
|
||||||
|
"elevFT": 75
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
691
src/test/resources/Issue593.xml
Normal file
691
src/test/resources/Issue593.xml
Normal file
@@ -0,0 +1,691 @@
|
|||||||
|
<success>true</success>
|
||||||
|
<response>
|
||||||
|
<loc>
|
||||||
|
<long>31.25</long>
|
||||||
|
<lat>30.063</lat>
|
||||||
|
</loc>
|
||||||
|
<profile>
|
||||||
|
<elevM>23</elevM>
|
||||||
|
<tz>Africa/Cairo</tz>
|
||||||
|
<elevFT>75</elevFT>
|
||||||
|
</profile>
|
||||||
|
<periods>
|
||||||
|
<dateTimeISO>2022-10-06T07:00:00+02:00</dateTimeISO>
|
||||||
|
<windDirMin80m>E</windDirMin80m>
|
||||||
|
<windDirMin80mDEG>95</windDirMin80mDEG>
|
||||||
|
<feelslikeC>21</feelslikeC>
|
||||||
|
<visibilityMI>15</visibilityMI>
|
||||||
|
<windSpeedMaxMPH>10</windSpeedMaxMPH>
|
||||||
|
<windDirDEG>353</windDirDEG>
|
||||||
|
<windDir>N</windDir>
|
||||||
|
<sunriseISO>2022-10-06T05:51:14+02:00</sunriseISO>
|
||||||
|
<iceaccumMM>null</iceaccumMM>
|
||||||
|
<windSpeedMaxKTS>9</windSpeedMaxKTS>
|
||||||
|
<iceaccumIN>null</iceaccumIN>
|
||||||
|
<minTempF>66</minTempF>
|
||||||
|
<snowIN>0</snowIN>
|
||||||
|
<weather>Mostly Sunny</weather>
|
||||||
|
<sunsetISO>2022-10-06T17:35:02+02:00</sunsetISO>
|
||||||
|
<maxFeelslikeC>32</maxFeelslikeC>
|
||||||
|
<humidity>77</humidity>
|
||||||
|
<windDir80m>N</windDir80m>
|
||||||
|
<maxFeelslikeF>89</maxFeelslikeF>
|
||||||
|
<precipMM>0</precipMM>
|
||||||
|
<sky>22</sky>
|
||||||
|
<windGust80mMPH>25</windGust80mMPH>
|
||||||
|
<windSpeedMax80mMPH>25</windSpeedMax80mMPH>
|
||||||
|
<weatherPrimary>Mostly Sunny</weatherPrimary>
|
||||||
|
<windGust80mKPH>41</windGust80mKPH>
|
||||||
|
<avgDewpointF>58</avgDewpointF>
|
||||||
|
<windSpeedMax80mKPH>41</windSpeedMax80mKPH>
|
||||||
|
<windGust80mKTS>22</windGust80mKTS>
|
||||||
|
<avgDewpointC>14</avgDewpointC>
|
||||||
|
<precipIN>0</precipIN>
|
||||||
|
<windSpeedMax80mKTS>22</windSpeedMax80mKTS>
|
||||||
|
<windDirMinDEG>353</windDirMinDEG>
|
||||||
|
<windSpeedMaxKPH>16</windSpeedMaxKPH>
|
||||||
|
<windSpeedMin80mKTS>8</windSpeedMin80mKTS>
|
||||||
|
<feelslikeF>70</feelslikeF>
|
||||||
|
<validTime>2022-10-06T07:00:00+02:00</validTime>
|
||||||
|
<windSpeedMin80mMPH>10</windSpeedMin80mMPH>
|
||||||
|
<solradMaxWM2>778</solradMaxWM2>
|
||||||
|
<avgTempC>25</avgTempC>
|
||||||
|
<windSpeedMin80mKPH>15</windSpeedMin80mKPH>
|
||||||
|
<weatherPrimaryCoded>::FW</weatherPrimaryCoded>
|
||||||
|
<sunrise>1665028274</sunrise>
|
||||||
|
<avgTempF>78</avgTempF>
|
||||||
|
<windDirMin>N</windDirMin>
|
||||||
|
<maxCoverage/>
|
||||||
|
<icon>fair.png</icon>
|
||||||
|
<minFeelslikeC>21</minFeelslikeC>
|
||||||
|
<dewpointC>17</dewpointC>
|
||||||
|
<cloudsCoded>FW</cloudsCoded>
|
||||||
|
<minFeelslikeF>70</minFeelslikeF>
|
||||||
|
<minHumidity>29</minHumidity>
|
||||||
|
<dewpointF>63</dewpointF>
|
||||||
|
<windSpeed80mKTS>12</windSpeed80mKTS>
|
||||||
|
<pop>0</pop>
|
||||||
|
<snowCM>0</snowCM>
|
||||||
|
<windDirMax>NNW</windDirMax>
|
||||||
|
<windSpeed80mMPH>13</windSpeed80mMPH>
|
||||||
|
<windSpeed80mKPH>22</windSpeed80mKPH>
|
||||||
|
<windDir80mDEG>11</windDir80mDEG>
|
||||||
|
<maxTempC>32</maxTempC>
|
||||||
|
<pressureMB>1015</pressureMB>
|
||||||
|
<visibilityKM>24.135</visibilityKM>
|
||||||
|
<timestamp>1665032400</timestamp>
|
||||||
|
<maxTempF>90</maxTempF>
|
||||||
|
<tempF>null</tempF>
|
||||||
|
<minDewpointC>11</minDewpointC>
|
||||||
|
<solradMinWM2>0</solradMinWM2>
|
||||||
|
<windSpeedMinKTS>1</windSpeedMinKTS>
|
||||||
|
<windDirMax80mDEG>343</windDirMax80mDEG>
|
||||||
|
<windGustKTS>21</windGustKTS>
|
||||||
|
<windSpeedMinKPH>2</windSpeedMinKPH>
|
||||||
|
<maxDewpointF>63</maxDewpointF>
|
||||||
|
<windSpeedMinMPH>1</windSpeedMinMPH>
|
||||||
|
<avgFeelslikeC>26</avgFeelslikeC>
|
||||||
|
<uvi>6</uvi>
|
||||||
|
<windDirMax80m>NNW</windDirMax80m>
|
||||||
|
<maxDewpointC>17</maxDewpointC>
|
||||||
|
<pressureIN>29.97</pressureIN>
|
||||||
|
<avgFeelslikeF>80</avgFeelslikeF>
|
||||||
|
<iceaccum>null</iceaccum>
|
||||||
|
<isDay>true</isDay>
|
||||||
|
<minTempC>19</minTempC>
|
||||||
|
<minDewpointF>52</minDewpointF>
|
||||||
|
<windSpeedKTS>5</windSpeedKTS>
|
||||||
|
<sunset>1665070502</sunset>
|
||||||
|
<solradWM2>5608</solradWM2>
|
||||||
|
<windSpeedKPH>9</windSpeedKPH>
|
||||||
|
<windGustMPH>25</windGustMPH>
|
||||||
|
<maxHumidity>77</maxHumidity>
|
||||||
|
<windSpeedMPH>6</windSpeedMPH>
|
||||||
|
<windGustKPH>40</windGustKPH>
|
||||||
|
<windDirMaxDEG>342</windDirMaxDEG>
|
||||||
|
<tempC>null</tempC>
|
||||||
|
</periods>
|
||||||
|
<periods>
|
||||||
|
<dateTimeISO>2022-10-07T07:00:00+02:00</dateTimeISO>
|
||||||
|
<windDirMin80m>NNW</windDirMin80m>
|
||||||
|
<windDirMin80mDEG>347</windDirMin80mDEG>
|
||||||
|
<feelslikeC>19</feelslikeC>
|
||||||
|
<visibilityMI>15</visibilityMI>
|
||||||
|
<windSpeedMaxMPH>8</windSpeedMaxMPH>
|
||||||
|
<windDirDEG>325</windDirDEG>
|
||||||
|
<windDir>NW</windDir>
|
||||||
|
<sunriseISO>2022-10-07T05:51:50+02:00</sunriseISO>
|
||||||
|
<iceaccumMM>null</iceaccumMM>
|
||||||
|
<windSpeedMaxKTS>7</windSpeedMaxKTS>
|
||||||
|
<iceaccumIN>null</iceaccumIN>
|
||||||
|
<minTempF>66</minTempF>
|
||||||
|
<snowIN>0</snowIN>
|
||||||
|
<weather>Mostly Sunny</weather>
|
||||||
|
<sunsetISO>2022-10-07T17:33:51+02:00</sunsetISO>
|
||||||
|
<maxFeelslikeC>29</maxFeelslikeC>
|
||||||
|
<humidity>77</humidity>
|
||||||
|
<windDir80m>NNW</windDir80m>
|
||||||
|
<maxFeelslikeF>85</maxFeelslikeF>
|
||||||
|
<precipMM>0</precipMM>
|
||||||
|
<sky>30</sky>
|
||||||
|
<windGust80mMPH>23</windGust80mMPH>
|
||||||
|
<windSpeedMax80mMPH>23</windSpeedMax80mMPH>
|
||||||
|
<weatherPrimary>Mostly Sunny</weatherPrimary>
|
||||||
|
<windGust80mKPH>37</windGust80mKPH>
|
||||||
|
<avgDewpointF>54</avgDewpointF>
|
||||||
|
<windSpeedMax80mKPH>37</windSpeedMax80mKPH>
|
||||||
|
<windGust80mKTS>20</windGust80mKTS>
|
||||||
|
<avgDewpointC>12</avgDewpointC>
|
||||||
|
<precipIN>0</precipIN>
|
||||||
|
<windSpeedMax80mKTS>20</windSpeedMax80mKTS>
|
||||||
|
<windDirMinDEG>325</windDirMinDEG>
|
||||||
|
<windSpeedMaxKPH>13</windSpeedMaxKPH>
|
||||||
|
<windSpeedMin80mKTS>6</windSpeedMin80mKTS>
|
||||||
|
<feelslikeF>67</feelslikeF>
|
||||||
|
<validTime>2022-10-07T07:00:00+02:00</validTime>
|
||||||
|
<windSpeedMin80mMPH>6</windSpeedMin80mMPH>
|
||||||
|
<solradMaxWM2>742</solradMaxWM2>
|
||||||
|
<avgTempC>24</avgTempC>
|
||||||
|
<windSpeedMin80mKPH>10</windSpeedMin80mKPH>
|
||||||
|
<weatherPrimaryCoded>::FW</weatherPrimaryCoded>
|
||||||
|
<sunrise>1665114710</sunrise>
|
||||||
|
<avgTempF>76</avgTempF>
|
||||||
|
<windDirMin>NW</windDirMin>
|
||||||
|
<maxCoverage/>
|
||||||
|
<icon>fair.png</icon>
|
||||||
|
<minFeelslikeC>19</minFeelslikeC>
|
||||||
|
<dewpointC>15</dewpointC>
|
||||||
|
<cloudsCoded>FW</cloudsCoded>
|
||||||
|
<minFeelslikeF>67</minFeelslikeF>
|
||||||
|
<minHumidity>30</minHumidity>
|
||||||
|
<dewpointF>60</dewpointF>
|
||||||
|
<windSpeed80mKTS>6</windSpeed80mKTS>
|
||||||
|
<pop>0</pop>
|
||||||
|
<snowCM>0</snowCM>
|
||||||
|
<windDirMax>WNW</windDirMax>
|
||||||
|
<windSpeed80mMPH>6</windSpeed80mMPH>
|
||||||
|
<windSpeed80mKPH>10</windSpeed80mKPH>
|
||||||
|
<windDir80mDEG>347</windDir80mDEG>
|
||||||
|
<maxTempC>30</maxTempC>
|
||||||
|
<pressureMB>1014</pressureMB>
|
||||||
|
<visibilityKM>24.135</visibilityKM>
|
||||||
|
<timestamp>1665118800</timestamp>
|
||||||
|
<maxTempF>86</maxTempF>
|
||||||
|
<tempF>null</tempF>
|
||||||
|
<minDewpointC>10</minDewpointC>
|
||||||
|
<solradMinWM2>0</solradMinWM2>
|
||||||
|
<windSpeedMinKTS>1</windSpeedMinKTS>
|
||||||
|
<windDirMax80mDEG>316</windDirMax80mDEG>
|
||||||
|
<windGustKTS>16</windGustKTS>
|
||||||
|
<windSpeedMinKPH>2</windSpeedMinKPH>
|
||||||
|
<maxDewpointF>60</maxDewpointF>
|
||||||
|
<windSpeedMinMPH>1</windSpeedMinMPH>
|
||||||
|
<avgFeelslikeC>24</avgFeelslikeC>
|
||||||
|
<uvi>6</uvi>
|
||||||
|
<windDirMax80m>NW</windDirMax80m>
|
||||||
|
<maxDewpointC>15</maxDewpointC>
|
||||||
|
<pressureIN>29.95</pressureIN>
|
||||||
|
<avgFeelslikeF>76</avgFeelslikeF>
|
||||||
|
<iceaccum>null</iceaccum>
|
||||||
|
<isDay>true</isDay>
|
||||||
|
<minTempC>19</minTempC>
|
||||||
|
<minDewpointF>50</minDewpointF>
|
||||||
|
<windSpeedKTS>1</windSpeedKTS>
|
||||||
|
<sunset>1665156831</sunset>
|
||||||
|
<solradWM2>5486</solradWM2>
|
||||||
|
<windSpeedKPH>2</windSpeedKPH>
|
||||||
|
<windGustMPH>18</windGustMPH>
|
||||||
|
<maxHumidity>77</maxHumidity>
|
||||||
|
<windSpeedMPH>1</windSpeedMPH>
|
||||||
|
<windGustKPH>29</windGustKPH>
|
||||||
|
<windDirMaxDEG>298</windDirMaxDEG>
|
||||||
|
<tempC>null</tempC>
|
||||||
|
</periods>
|
||||||
|
<periods>
|
||||||
|
<dateTimeISO>2022-10-08T07:00:00+02:00</dateTimeISO>
|
||||||
|
<windDirMin80m>NW</windDirMin80m>
|
||||||
|
<windDirMin80mDEG>309</windDirMin80mDEG>
|
||||||
|
<feelslikeC>19</feelslikeC>
|
||||||
|
<visibilityMI>15</visibilityMI>
|
||||||
|
<windSpeedMaxMPH>8</windSpeedMaxMPH>
|
||||||
|
<windDirDEG>21</windDirDEG>
|
||||||
|
<windDir>NNE</windDir>
|
||||||
|
<sunriseISO>2022-10-08T05:52:26+02:00</sunriseISO>
|
||||||
|
<iceaccumMM>null</iceaccumMM>
|
||||||
|
<windSpeedMaxKTS>7</windSpeedMaxKTS>
|
||||||
|
<iceaccumIN>null</iceaccumIN>
|
||||||
|
<minTempF>66</minTempF>
|
||||||
|
<snowIN>0</snowIN>
|
||||||
|
<weather>Partly Cloudy</weather>
|
||||||
|
<sunsetISO>2022-10-08T17:32:41+02:00</sunsetISO>
|
||||||
|
<maxFeelslikeC>30</maxFeelslikeC>
|
||||||
|
<humidity>76</humidity>
|
||||||
|
<windDir80m>NW</windDir80m>
|
||||||
|
<maxFeelslikeF>86</maxFeelslikeF>
|
||||||
|
<precipMM>0</precipMM>
|
||||||
|
<sky>47</sky>
|
||||||
|
<windGust80mMPH>19</windGust80mMPH>
|
||||||
|
<windSpeedMax80mMPH>19</windSpeedMax80mMPH>
|
||||||
|
<weatherPrimary>Partly Cloudy</weatherPrimary>
|
||||||
|
<windGust80mKPH>31</windGust80mKPH>
|
||||||
|
<avgDewpointF>56</avgDewpointF>
|
||||||
|
<windSpeedMax80mKPH>31</windSpeedMax80mKPH>
|
||||||
|
<windGust80mKTS>17</windGust80mKTS>
|
||||||
|
<avgDewpointC>13</avgDewpointC>
|
||||||
|
<precipIN>0</precipIN>
|
||||||
|
<windSpeedMax80mKTS>17</windSpeedMax80mKTS>
|
||||||
|
<windDirMinDEG>21</windDirMinDEG>
|
||||||
|
<windSpeedMaxKPH>13</windSpeedMaxKPH>
|
||||||
|
<windSpeedMin80mKTS>5</windSpeedMin80mKTS>
|
||||||
|
<feelslikeF>67</feelslikeF>
|
||||||
|
<validTime>2022-10-08T07:00:00+02:00</validTime>
|
||||||
|
<windSpeedMin80mMPH>5</windSpeedMin80mMPH>
|
||||||
|
<solradMaxWM2>682</solradMaxWM2>
|
||||||
|
<avgTempC>25</avgTempC>
|
||||||
|
<windSpeedMin80mKPH>9</windSpeedMin80mKPH>
|
||||||
|
<weatherPrimaryCoded>::SC</weatherPrimaryCoded>
|
||||||
|
<sunrise>1665201146</sunrise>
|
||||||
|
<avgTempF>76</avgTempF>
|
||||||
|
<windDirMin>NNE</windDirMin>
|
||||||
|
<maxCoverage/>
|
||||||
|
<icon>pcloudy.png</icon>
|
||||||
|
<minFeelslikeC>19</minFeelslikeC>
|
||||||
|
<dewpointC>15</dewpointC>
|
||||||
|
<cloudsCoded>SC</cloudsCoded>
|
||||||
|
<minFeelslikeF>67</minFeelslikeF>
|
||||||
|
<minHumidity>32</minHumidity>
|
||||||
|
<dewpointF>59</dewpointF>
|
||||||
|
<windSpeed80mKTS>5</windSpeed80mKTS>
|
||||||
|
<pop>0</pop>
|
||||||
|
<snowCM>0</snowCM>
|
||||||
|
<windDirMax>WNW</windDirMax>
|
||||||
|
<windSpeed80mMPH>5</windSpeed80mMPH>
|
||||||
|
<windSpeed80mKPH>9</windSpeed80mKPH>
|
||||||
|
<windDir80mDEG>309</windDir80mDEG>
|
||||||
|
<maxTempC>30</maxTempC>
|
||||||
|
<pressureMB>1014</pressureMB>
|
||||||
|
<visibilityKM>24.135</visibilityKM>
|
||||||
|
<timestamp>1665205200</timestamp>
|
||||||
|
<maxTempF>87</maxTempF>
|
||||||
|
<tempF>null</tempF>
|
||||||
|
<minDewpointC>11</minDewpointC>
|
||||||
|
<solradMinWM2>0</solradMinWM2>
|
||||||
|
<windSpeedMinKTS>1</windSpeedMinKTS>
|
||||||
|
<windDirMax80mDEG>322</windDirMax80mDEG>
|
||||||
|
<windGustKTS>17</windGustKTS>
|
||||||
|
<windSpeedMinKPH>2</windSpeedMinKPH>
|
||||||
|
<maxDewpointF>59</maxDewpointF>
|
||||||
|
<windSpeedMinMPH>1</windSpeedMinMPH>
|
||||||
|
<avgFeelslikeC>25</avgFeelslikeC>
|
||||||
|
<uvi>7</uvi>
|
||||||
|
<windDirMax80m>NW</windDirMax80m>
|
||||||
|
<maxDewpointC>15</maxDewpointC>
|
||||||
|
<pressureIN>29.94</pressureIN>
|
||||||
|
<avgFeelslikeF>76</avgFeelslikeF>
|
||||||
|
<iceaccum>null</iceaccum>
|
||||||
|
<isDay>true</isDay>
|
||||||
|
<minTempC>19</minTempC>
|
||||||
|
<minDewpointF>52</minDewpointF>
|
||||||
|
<windSpeedKTS>1</windSpeedKTS>
|
||||||
|
<sunset>1665243161</sunset>
|
||||||
|
<solradWM2>4785</solradWM2>
|
||||||
|
<windSpeedKPH>2</windSpeedKPH>
|
||||||
|
<windGustMPH>20</windGustMPH>
|
||||||
|
<maxHumidity>76</maxHumidity>
|
||||||
|
<windSpeedMPH>1</windSpeedMPH>
|
||||||
|
<windGustKPH>32</windGustKPH>
|
||||||
|
<windDirMaxDEG>301</windDirMaxDEG>
|
||||||
|
<tempC>null</tempC>
|
||||||
|
</periods>
|
||||||
|
<periods>
|
||||||
|
<dateTimeISO>2022-10-09T07:00:00+02:00</dateTimeISO>
|
||||||
|
<windDirMin80m>NW</windDirMin80m>
|
||||||
|
<windDirMin80mDEG>316</windDirMin80mDEG>
|
||||||
|
<feelslikeC>20</feelslikeC>
|
||||||
|
<visibilityMI>15</visibilityMI>
|
||||||
|
<windSpeedMaxMPH>9</windSpeedMaxMPH>
|
||||||
|
<windDirDEG>356</windDirDEG>
|
||||||
|
<windDir>N</windDir>
|
||||||
|
<sunriseISO>2022-10-09T05:53:03+02:00</sunriseISO>
|
||||||
|
<iceaccumMM>null</iceaccumMM>
|
||||||
|
<windSpeedMaxKTS>8</windSpeedMaxKTS>
|
||||||
|
<iceaccumIN>null</iceaccumIN>
|
||||||
|
<minTempF>67</minTempF>
|
||||||
|
<snowIN>0</snowIN>
|
||||||
|
<weather>Partly Cloudy</weather>
|
||||||
|
<sunsetISO>2022-10-09T17:31:31+02:00</sunsetISO>
|
||||||
|
<maxFeelslikeC>30</maxFeelslikeC>
|
||||||
|
<humidity>86</humidity>
|
||||||
|
<windDir80m>NW</windDir80m>
|
||||||
|
<maxFeelslikeF>86</maxFeelslikeF>
|
||||||
|
<precipMM>0</precipMM>
|
||||||
|
<sky>47</sky>
|
||||||
|
<windGust80mMPH>23</windGust80mMPH>
|
||||||
|
<windSpeedMax80mMPH>23</windSpeedMax80mMPH>
|
||||||
|
<weatherPrimary>Partly Cloudy</weatherPrimary>
|
||||||
|
<windGust80mKPH>36</windGust80mKPH>
|
||||||
|
<avgDewpointF>57</avgDewpointF>
|
||||||
|
<windSpeedMax80mKPH>36</windSpeedMax80mKPH>
|
||||||
|
<windGust80mKTS>20</windGust80mKTS>
|
||||||
|
<avgDewpointC>14</avgDewpointC>
|
||||||
|
<precipIN>0</precipIN>
|
||||||
|
<windSpeedMax80mKTS>20</windSpeedMax80mKTS>
|
||||||
|
<windDirMinDEG>356</windDirMinDEG>
|
||||||
|
<windSpeedMaxKPH>14</windSpeedMaxKPH>
|
||||||
|
<windSpeedMin80mKTS>5</windSpeedMin80mKTS>
|
||||||
|
<feelslikeF>67</feelslikeF>
|
||||||
|
<validTime>2022-10-09T07:00:00+02:00</validTime>
|
||||||
|
<windSpeedMin80mMPH>6</windSpeedMin80mMPH>
|
||||||
|
<solradMaxWM2>726</solradMaxWM2>
|
||||||
|
<avgTempC>25</avgTempC>
|
||||||
|
<windSpeedMin80mKPH>9</windSpeedMin80mKPH>
|
||||||
|
<weatherPrimaryCoded>::SC</weatherPrimaryCoded>
|
||||||
|
<sunrise>1665287583</sunrise>
|
||||||
|
<avgTempF>77</avgTempF>
|
||||||
|
<windDirMin>N</windDirMin>
|
||||||
|
<maxCoverage/>
|
||||||
|
<icon>pcloudy.png</icon>
|
||||||
|
<minFeelslikeC>20</minFeelslikeC>
|
||||||
|
<dewpointC>17</dewpointC>
|
||||||
|
<cloudsCoded>SC</cloudsCoded>
|
||||||
|
<minFeelslikeF>67</minFeelslikeF>
|
||||||
|
<minHumidity>31</minHumidity>
|
||||||
|
<dewpointF>63</dewpointF>
|
||||||
|
<windSpeed80mKTS>5</windSpeed80mKTS>
|
||||||
|
<pop>0</pop>
|
||||||
|
<snowCM>0</snowCM>
|
||||||
|
<windDirMax>NNW</windDirMax>
|
||||||
|
<windSpeed80mMPH>6</windSpeed80mMPH>
|
||||||
|
<windSpeed80mKPH>9</windSpeed80mKPH>
|
||||||
|
<windDir80mDEG>316</windDir80mDEG>
|
||||||
|
<maxTempC>31</maxTempC>
|
||||||
|
<pressureMB>1016</pressureMB>
|
||||||
|
<visibilityKM>24.135</visibilityKM>
|
||||||
|
<timestamp>1665291600</timestamp>
|
||||||
|
<maxTempF>87</maxTempF>
|
||||||
|
<tempF>null</tempF>
|
||||||
|
<minDewpointC>11</minDewpointC>
|
||||||
|
<solradMinWM2>0</solradMinWM2>
|
||||||
|
<windSpeedMinKTS>2</windSpeedMinKTS>
|
||||||
|
<windDirMax80mDEG>354</windDirMax80mDEG>
|
||||||
|
<windGustKTS>19</windGustKTS>
|
||||||
|
<windSpeedMinKPH>4</windSpeedMinKPH>
|
||||||
|
<maxDewpointF>63</maxDewpointF>
|
||||||
|
<windSpeedMinMPH>2</windSpeedMinMPH>
|
||||||
|
<avgFeelslikeC>25</avgFeelslikeC>
|
||||||
|
<uvi>7</uvi>
|
||||||
|
<windDirMax80m>N</windDirMax80m>
|
||||||
|
<maxDewpointC>17</maxDewpointC>
|
||||||
|
<pressureIN>29.99</pressureIN>
|
||||||
|
<avgFeelslikeF>77</avgFeelslikeF>
|
||||||
|
<iceaccum>null</iceaccum>
|
||||||
|
<isDay>true</isDay>
|
||||||
|
<minTempC>19</minTempC>
|
||||||
|
<minDewpointF>52</minDewpointF>
|
||||||
|
<windSpeedKTS>2</windSpeedKTS>
|
||||||
|
<sunset>1665329491</sunset>
|
||||||
|
<solradWM2>4768</solradWM2>
|
||||||
|
<windSpeedKPH>4</windSpeedKPH>
|
||||||
|
<windGustMPH>22</windGustMPH>
|
||||||
|
<maxHumidity>86</maxHumidity>
|
||||||
|
<windSpeedMPH>2</windSpeedMPH>
|
||||||
|
<windGustKPH>36</windGustKPH>
|
||||||
|
<windDirMaxDEG>343</windDirMaxDEG>
|
||||||
|
<tempC>null</tempC>
|
||||||
|
</periods>
|
||||||
|
<periods>
|
||||||
|
<dateTimeISO>2022-10-10T07:00:00+02:00</dateTimeISO>
|
||||||
|
<windDirMin80m>E</windDirMin80m>
|
||||||
|
<windDirMin80mDEG>91</windDirMin80mDEG>
|
||||||
|
<feelslikeC>21</feelslikeC>
|
||||||
|
<visibilityMI>15</visibilityMI>
|
||||||
|
<windSpeedMaxMPH>9</windSpeedMaxMPH>
|
||||||
|
<windDirDEG>358</windDirDEG>
|
||||||
|
<windDir>N</windDir>
|
||||||
|
<sunriseISO>2022-10-10T05:53:40+02:00</sunriseISO>
|
||||||
|
<iceaccumMM>null</iceaccumMM>
|
||||||
|
<windSpeedMaxKTS>8</windSpeedMaxKTS>
|
||||||
|
<iceaccumIN>null</iceaccumIN>
|
||||||
|
<minTempF>70</minTempF>
|
||||||
|
<snowIN>0</snowIN>
|
||||||
|
<weather>Partly Cloudy</weather>
|
||||||
|
<sunsetISO>2022-10-10T17:30:21+02:00</sunsetISO>
|
||||||
|
<maxFeelslikeC>30</maxFeelslikeC>
|
||||||
|
<humidity>75</humidity>
|
||||||
|
<windDir80m>N</windDir80m>
|
||||||
|
<maxFeelslikeF>86</maxFeelslikeF>
|
||||||
|
<precipMM>0</precipMM>
|
||||||
|
<sky>64</sky>
|
||||||
|
<windGust80mMPH>22</windGust80mMPH>
|
||||||
|
<windSpeedMax80mMPH>22</windSpeedMax80mMPH>
|
||||||
|
<weatherPrimary>Partly Cloudy</weatherPrimary>
|
||||||
|
<windGust80mKPH>36</windGust80mKPH>
|
||||||
|
<avgDewpointF>58</avgDewpointF>
|
||||||
|
<windSpeedMax80mKPH>36</windSpeedMax80mKPH>
|
||||||
|
<windGust80mKTS>19</windGust80mKTS>
|
||||||
|
<avgDewpointC>14</avgDewpointC>
|
||||||
|
<precipIN>0</precipIN>
|
||||||
|
<windSpeedMax80mKTS>19</windSpeedMax80mKTS>
|
||||||
|
<windDirMinDEG>358</windDirMinDEG>
|
||||||
|
<windSpeedMaxKPH>15</windSpeedMaxKPH>
|
||||||
|
<windSpeedMin80mKTS>7</windSpeedMin80mKTS>
|
||||||
|
<feelslikeF>69</feelslikeF>
|
||||||
|
<validTime>2022-10-10T07:00:00+02:00</validTime>
|
||||||
|
<windSpeedMin80mMPH>8</windSpeedMin80mMPH>
|
||||||
|
<solradMaxWM2>597</solradMaxWM2>
|
||||||
|
<avgTempC>26</avgTempC>
|
||||||
|
<windSpeedMin80mKPH>13</windSpeedMin80mKPH>
|
||||||
|
<weatherPrimaryCoded>::SC</weatherPrimaryCoded>
|
||||||
|
<sunrise>1665374020</sunrise>
|
||||||
|
<avgTempF>78</avgTempF>
|
||||||
|
<windDirMin>N</windDirMin>
|
||||||
|
<maxCoverage/>
|
||||||
|
<icon>pcloudy.png</icon>
|
||||||
|
<minFeelslikeC>21</minFeelslikeC>
|
||||||
|
<dewpointC>16</dewpointC>
|
||||||
|
<cloudsCoded>SC</cloudsCoded>
|
||||||
|
<minFeelslikeF>69</minFeelslikeF>
|
||||||
|
<minHumidity>35</minHumidity>
|
||||||
|
<dewpointF>61</dewpointF>
|
||||||
|
<windSpeed80mKTS>7</windSpeed80mKTS>
|
||||||
|
<pop>0</pop>
|
||||||
|
<snowCM>0</snowCM>
|
||||||
|
<windDirMax>N</windDirMax>
|
||||||
|
<windSpeed80mMPH>8</windSpeed80mMPH>
|
||||||
|
<windSpeed80mKPH>13</windSpeed80mKPH>
|
||||||
|
<windDir80mDEG>8</windDir80mDEG>
|
||||||
|
<maxTempC>31</maxTempC>
|
||||||
|
<pressureMB>1017</pressureMB>
|
||||||
|
<visibilityKM>24.135</visibilityKM>
|
||||||
|
<timestamp>1665378000</timestamp>
|
||||||
|
<maxTempF>87</maxTempF>
|
||||||
|
<tempF>null</tempF>
|
||||||
|
<minDewpointC>13</minDewpointC>
|
||||||
|
<solradMinWM2>0</solradMinWM2>
|
||||||
|
<windSpeedMinKTS>2</windSpeedMinKTS>
|
||||||
|
<windDirMax80mDEG>10</windDirMax80mDEG>
|
||||||
|
<windGustKTS>16</windGustKTS>
|
||||||
|
<windSpeedMinKPH>4</windSpeedMinKPH>
|
||||||
|
<maxDewpointF>61</maxDewpointF>
|
||||||
|
<windSpeedMinMPH>2</windSpeedMinMPH>
|
||||||
|
<avgFeelslikeC>25</avgFeelslikeC>
|
||||||
|
<uvi>6</uvi>
|
||||||
|
<windDirMax80m>N</windDirMax80m>
|
||||||
|
<maxDewpointC>16</maxDewpointC>
|
||||||
|
<pressureIN>30.03</pressureIN>
|
||||||
|
<avgFeelslikeF>78</avgFeelslikeF>
|
||||||
|
<iceaccum>null</iceaccum>
|
||||||
|
<isDay>true</isDay>
|
||||||
|
<minTempC>21</minTempC>
|
||||||
|
<minDewpointF>55</minDewpointF>
|
||||||
|
<windSpeedKTS>2</windSpeedKTS>
|
||||||
|
<sunset>1665415821</sunset>
|
||||||
|
<solradWM2>4494</solradWM2>
|
||||||
|
<windSpeedKPH>4</windSpeedKPH>
|
||||||
|
<windGustMPH>19</windGustMPH>
|
||||||
|
<maxHumidity>75</maxHumidity>
|
||||||
|
<windSpeedMPH>2</windSpeedMPH>
|
||||||
|
<windGustKPH>30</windGustKPH>
|
||||||
|
<windDirMaxDEG>10</windDirMaxDEG>
|
||||||
|
<tempC>null</tempC>
|
||||||
|
</periods>
|
||||||
|
<periods>
|
||||||
|
<dateTimeISO>2022-10-11T07:00:00+02:00</dateTimeISO>
|
||||||
|
<windDirMin80m>NNE</windDirMin80m>
|
||||||
|
<windDirMin80mDEG>13</windDirMin80mDEG>
|
||||||
|
<feelslikeC>22</feelslikeC>
|
||||||
|
<visibilityMI>15</visibilityMI>
|
||||||
|
<windSpeedMaxMPH>18</windSpeedMaxMPH>
|
||||||
|
<windDirDEG>13</windDirDEG>
|
||||||
|
<windDir>NNE</windDir>
|
||||||
|
<sunriseISO>2022-10-11T05:54:18+02:00</sunriseISO>
|
||||||
|
<iceaccumMM>null</iceaccumMM>
|
||||||
|
<windSpeedMaxKTS>15</windSpeedMaxKTS>
|
||||||
|
<iceaccumIN>null</iceaccumIN>
|
||||||
|
<minTempF>70</minTempF>
|
||||||
|
<snowIN>0</snowIN>
|
||||||
|
<weather>Sunny</weather>
|
||||||
|
<sunsetISO>2022-10-11T17:29:13+02:00</sunsetISO>
|
||||||
|
<maxFeelslikeC>31</maxFeelslikeC>
|
||||||
|
<humidity>71</humidity>
|
||||||
|
<windDir80m>NNE</windDir80m>
|
||||||
|
<maxFeelslikeF>87</maxFeelslikeF>
|
||||||
|
<precipMM>0</precipMM>
|
||||||
|
<sky>0</sky>
|
||||||
|
<windGust80mMPH>19</windGust80mMPH>
|
||||||
|
<windSpeedMax80mMPH>19</windSpeedMax80mMPH>
|
||||||
|
<weatherPrimary>Sunny</weatherPrimary>
|
||||||
|
<windGust80mKPH>31</windGust80mKPH>
|
||||||
|
<avgDewpointF>55</avgDewpointF>
|
||||||
|
<windSpeedMax80mKPH>31</windSpeedMax80mKPH>
|
||||||
|
<windGust80mKTS>17</windGust80mKTS>
|
||||||
|
<avgDewpointC>13</avgDewpointC>
|
||||||
|
<precipIN>0</precipIN>
|
||||||
|
<windSpeedMax80mKTS>17</windSpeedMax80mKTS>
|
||||||
|
<windDirMinDEG>14</windDirMinDEG>
|
||||||
|
<windSpeedMaxKPH>28</windSpeedMaxKPH>
|
||||||
|
<windSpeedMin80mKTS>9</windSpeedMin80mKTS>
|
||||||
|
<feelslikeF>72</feelslikeF>
|
||||||
|
<validTime>2022-10-11T07:00:00+02:00</validTime>
|
||||||
|
<windSpeedMin80mMPH>11</windSpeedMin80mMPH>
|
||||||
|
<solradMaxWM2>758</solradMaxWM2>
|
||||||
|
<avgTempC>26</avgTempC>
|
||||||
|
<windSpeedMin80mKPH>18</windSpeedMin80mKPH>
|
||||||
|
<weatherPrimaryCoded>::CL</weatherPrimaryCoded>
|
||||||
|
<sunrise>1665460458</sunrise>
|
||||||
|
<avgTempF>78</avgTempF>
|
||||||
|
<windDirMin>NNE</windDirMin>
|
||||||
|
<maxCoverage/>
|
||||||
|
<icon>sunny.png</icon>
|
||||||
|
<minFeelslikeC>22</minFeelslikeC>
|
||||||
|
<dewpointC>17</dewpointC>
|
||||||
|
<cloudsCoded>CL</cloudsCoded>
|
||||||
|
<minFeelslikeF>72</minFeelslikeF>
|
||||||
|
<minHumidity>30</minHumidity>
|
||||||
|
<dewpointF>62</dewpointF>
|
||||||
|
<windSpeed80mKTS>10</windSpeed80mKTS>
|
||||||
|
<pop>0</pop>
|
||||||
|
<snowCM>0</snowCM>
|
||||||
|
<windDirMax>NNE</windDirMax>
|
||||||
|
<windSpeed80mMPH>12</windSpeed80mMPH>
|
||||||
|
<windSpeed80mKPH>19</windSpeed80mKPH>
|
||||||
|
<windDir80mDEG>16</windDir80mDEG>
|
||||||
|
<maxTempC>31</maxTempC>
|
||||||
|
<pressureMB>1015</pressureMB>
|
||||||
|
<visibilityKM>24.135</visibilityKM>
|
||||||
|
<timestamp>1665464400</timestamp>
|
||||||
|
<maxTempF>87</maxTempF>
|
||||||
|
<tempF>null</tempF>
|
||||||
|
<minDewpointC>11</minDewpointC>
|
||||||
|
<solradMinWM2>0</solradMinWM2>
|
||||||
|
<windSpeedMinKTS>7</windSpeedMinKTS>
|
||||||
|
<windDirMax80mDEG>28</windDirMax80mDEG>
|
||||||
|
<windGustKTS>15</windGustKTS>
|
||||||
|
<windSpeedMinKPH>14</windSpeedMinKPH>
|
||||||
|
<maxDewpointF>62</maxDewpointF>
|
||||||
|
<windSpeedMinMPH>8</windSpeedMinMPH>
|
||||||
|
<avgFeelslikeC>26</avgFeelslikeC>
|
||||||
|
<uvi>null</uvi>
|
||||||
|
<windDirMax80m>NNE</windDirMax80m>
|
||||||
|
<maxDewpointC>17</maxDewpointC>
|
||||||
|
<pressureIN>29.98</pressureIN>
|
||||||
|
<avgFeelslikeF>79</avgFeelslikeF>
|
||||||
|
<iceaccum>null</iceaccum>
|
||||||
|
<isDay>true</isDay>
|
||||||
|
<minTempC>21</minTempC>
|
||||||
|
<minDewpointF>51</minDewpointF>
|
||||||
|
<windSpeedKTS>8</windSpeedKTS>
|
||||||
|
<sunset>1665502153</sunset>
|
||||||
|
<solradWM2>5450</solradWM2>
|
||||||
|
<windSpeedKPH>15</windSpeedKPH>
|
||||||
|
<windGustMPH>17</windGustMPH>
|
||||||
|
<maxHumidity>71</maxHumidity>
|
||||||
|
<windSpeedMPH>9</windSpeedMPH>
|
||||||
|
<windGustKPH>28</windGustKPH>
|
||||||
|
<windDirMaxDEG>28</windDirMaxDEG>
|
||||||
|
<tempC>null</tempC>
|
||||||
|
</periods>
|
||||||
|
<periods>
|
||||||
|
<dateTimeISO>2022-10-12T07:00:00+02:00</dateTimeISO>
|
||||||
|
<windDirMin80m>NNE</windDirMin80m>
|
||||||
|
<windDirMin80mDEG>15</windDirMin80mDEG>
|
||||||
|
<feelslikeC>22</feelslikeC>
|
||||||
|
<visibilityMI>15</visibilityMI>
|
||||||
|
<windSpeedMaxMPH>16</windSpeedMaxMPH>
|
||||||
|
<windDirDEG>12</windDirDEG>
|
||||||
|
<windDir>NNE</windDir>
|
||||||
|
<sunriseISO>2022-10-12T05:54:55+02:00</sunriseISO>
|
||||||
|
<iceaccumMM>null</iceaccumMM>
|
||||||
|
<windSpeedMaxKTS>14</windSpeedMaxKTS>
|
||||||
|
<iceaccumIN>null</iceaccumIN>
|
||||||
|
<minTempF>69</minTempF>
|
||||||
|
<snowIN>0</snowIN>
|
||||||
|
<weather>Mostly Sunny</weather>
|
||||||
|
<sunsetISO>2022-10-12T17:28:04+02:00</sunsetISO>
|
||||||
|
<maxFeelslikeC>31</maxFeelslikeC>
|
||||||
|
<humidity>68</humidity>
|
||||||
|
<windDir80m>NNE</windDir80m>
|
||||||
|
<maxFeelslikeF>88</maxFeelslikeF>
|
||||||
|
<precipMM>0</precipMM>
|
||||||
|
<sky>27</sky>
|
||||||
|
<windGust80mMPH>21</windGust80mMPH>
|
||||||
|
<windSpeedMax80mMPH>21</windSpeedMax80mMPH>
|
||||||
|
<weatherPrimary>Mostly Sunny</weatherPrimary>
|
||||||
|
<windGust80mKPH>33</windGust80mKPH>
|
||||||
|
<avgDewpointF>55</avgDewpointF>
|
||||||
|
<windSpeedMax80mKPH>33</windSpeedMax80mKPH>
|
||||||
|
<windGust80mKTS>18</windGust80mKTS>
|
||||||
|
<avgDewpointC>13</avgDewpointC>
|
||||||
|
<precipIN>0</precipIN>
|
||||||
|
<windSpeedMax80mKTS>18</windSpeedMax80mKTS>
|
||||||
|
<windDirMinDEG>12</windDirMinDEG>
|
||||||
|
<windSpeedMaxKPH>26</windSpeedMaxKPH>
|
||||||
|
<windSpeedMin80mKTS>10</windSpeedMin80mKTS>
|
||||||
|
<feelslikeF>72</feelslikeF>
|
||||||
|
<validTime>2022-10-12T07:00:00+02:00</validTime>
|
||||||
|
<windSpeedMin80mMPH>11</windSpeedMin80mMPH>
|
||||||
|
<solradMaxWM2>743</solradMaxWM2>
|
||||||
|
<avgTempC>26</avgTempC>
|
||||||
|
<windSpeedMin80mKPH>18</windSpeedMin80mKPH>
|
||||||
|
<weatherPrimaryCoded>::FW</weatherPrimaryCoded>
|
||||||
|
<sunrise>1665546895</sunrise>
|
||||||
|
<avgTempF>79</avgTempF>
|
||||||
|
<windDirMin>NNE</windDirMin>
|
||||||
|
<maxCoverage/>
|
||||||
|
<icon>fair.png</icon>
|
||||||
|
<minFeelslikeC>22</minFeelslikeC>
|
||||||
|
<dewpointC>16</dewpointC>
|
||||||
|
<cloudsCoded>FW</cloudsCoded>
|
||||||
|
<minFeelslikeF>72</minFeelslikeF>
|
||||||
|
<minHumidity>29</minHumidity>
|
||||||
|
<dewpointF>60</dewpointF>
|
||||||
|
<windSpeed80mKTS>10</windSpeed80mKTS>
|
||||||
|
<pop>0</pop>
|
||||||
|
<snowCM>0</snowCM>
|
||||||
|
<windDirMax>E</windDirMax>
|
||||||
|
<windSpeed80mMPH>12</windSpeed80mMPH>
|
||||||
|
<windSpeed80mKPH>19</windSpeed80mKPH>
|
||||||
|
<windDir80mDEG>15</windDir80mDEG>
|
||||||
|
<maxTempC>31</maxTempC>
|
||||||
|
<pressureMB>1014</pressureMB>
|
||||||
|
<visibilityKM>24.135</visibilityKM>
|
||||||
|
<timestamp>1665550800</timestamp>
|
||||||
|
<maxTempF>88</maxTempF>
|
||||||
|
<tempF>null</tempF>
|
||||||
|
<minDewpointC>11</minDewpointC>
|
||||||
|
<solradMinWM2>0</solradMinWM2>
|
||||||
|
<windSpeedMinKTS>7</windSpeedMinKTS>
|
||||||
|
<windDirMax80mDEG>96</windDirMax80mDEG>
|
||||||
|
<windGustKTS>15</windGustKTS>
|
||||||
|
<windSpeedMinKPH>13</windSpeedMinKPH>
|
||||||
|
<maxDewpointF>60</maxDewpointF>
|
||||||
|
<windSpeedMinMPH>8</windSpeedMinMPH>
|
||||||
|
<avgFeelslikeC>26</avgFeelslikeC>
|
||||||
|
<uvi>null</uvi>
|
||||||
|
<windDirMax80m>E</windDirMax80m>
|
||||||
|
<maxDewpointC>16</maxDewpointC>
|
||||||
|
<pressureIN>29.95</pressureIN>
|
||||||
|
<avgFeelslikeF>80</avgFeelslikeF>
|
||||||
|
<iceaccum>null</iceaccum>
|
||||||
|
<isDay>true</isDay>
|
||||||
|
<minTempC>21</minTempC>
|
||||||
|
<minDewpointF>51</minDewpointF>
|
||||||
|
<windSpeedKTS>8</windSpeedKTS>
|
||||||
|
<sunset>1665588484</sunset>
|
||||||
|
<solradWM2>4740</solradWM2>
|
||||||
|
<windSpeedKPH>15</windSpeedKPH>
|
||||||
|
<windGustMPH>17</windGustMPH>
|
||||||
|
<maxHumidity>68</maxHumidity>
|
||||||
|
<windSpeedMPH>9</windSpeedMPH>
|
||||||
|
<windGustKPH>28</windGustKPH>
|
||||||
|
<windDirMaxDEG>96</windDirMaxDEG>
|
||||||
|
<tempC>null</tempC>
|
||||||
|
</periods>
|
||||||
|
<interval>day</interval>
|
||||||
|
<place>
|
||||||
|
<country>eg</country>
|
||||||
|
<name>cairo</name>
|
||||||
|
<state>qh</state>
|
||||||
|
</place>
|
||||||
|
</response>
|
||||||
|
<error>null</error>
|
||||||
Reference in New Issue
Block a user