mirror of
https://github.com/stleary/JSON-java.git
synced 2026-03-20 00:00:50 -04:00
Revert "Merge pull request #877 from rikkarth/feat/871-strictMode"
This reverts commitd02ac0f2a3, reversing changes made tocfd47615d0.
This commit is contained in:
@@ -1,24 +1,14 @@
|
||||
package org.json.junit;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
import org.json.JSONParserConfiguration;
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertThrows;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
public class JSONParserConfigurationTest {
|
||||
|
||||
private static final String TEST_SOURCE = "{\"key\": \"value1\", \"key\": \"value2\"}";
|
||||
|
||||
@Test(expected = JSONException.class)
|
||||
@@ -29,162 +19,16 @@ public class JSONParserConfigurationTest {
|
||||
@Test
|
||||
public void testOverwrite() {
|
||||
JSONObject jsonObject = new JSONObject(TEST_SOURCE,
|
||||
new JSONParserConfiguration().withOverwriteDuplicateKey(true));
|
||||
new JSONParserConfiguration().withOverwriteDuplicateKey(true));
|
||||
|
||||
assertEquals("duplicate key should be overwritten", "value2", jsonObject.getString("key"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenInvalidInputArrays_testStrictModeTrue_shouldThrowJsonException() {
|
||||
JSONParserConfiguration jsonParserConfiguration = new JSONParserConfiguration()
|
||||
.withStrictMode(true);
|
||||
|
||||
List<String> strictModeInputTestCases = getNonCompliantJSONList();
|
||||
|
||||
strictModeInputTestCases.forEach(
|
||||
testCase -> assertThrows("expected non-compliant array but got instead: " + testCase, JSONException.class,
|
||||
() -> new JSONArray(testCase, jsonParserConfiguration)));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenCompliantJSONArrayFile_testStrictModeTrue_shouldNotThrowAnyException() throws IOException {
|
||||
try (Stream<String> lines = Files.lines(Paths.get("src/test/resources/compliantJsonArray.json"))) {
|
||||
String compliantJsonArrayAsString = lines.collect(Collectors.joining());
|
||||
JSONParserConfiguration jsonParserConfiguration = new JSONParserConfiguration()
|
||||
.withStrictMode(true);
|
||||
|
||||
new JSONArray(compliantJsonArrayAsString, jsonParserConfiguration);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenInvalidInputArrays_testStrictModeFalse_shouldNotThrowAnyException() {
|
||||
JSONParserConfiguration jsonParserConfiguration = new JSONParserConfiguration()
|
||||
.withStrictMode(false);
|
||||
|
||||
List<String> strictModeInputTestCases = getNonCompliantJSONList();
|
||||
|
||||
strictModeInputTestCases.forEach(testCase -> new JSONArray(testCase, jsonParserConfiguration));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenInvalidInputArray_testStrictModeTrue_shouldThrowInvalidCharacterErrorMessage() {
|
||||
JSONParserConfiguration jsonParserConfiguration = new JSONParserConfiguration()
|
||||
.withStrictMode(true);
|
||||
|
||||
String testCase = "[1,2];[3,4]";
|
||||
|
||||
JSONException je = assertThrows("expected non-compliant array but got instead: " + testCase,
|
||||
JSONException.class, () -> new JSONArray(testCase, jsonParserConfiguration));
|
||||
|
||||
assertEquals("invalid character found after end of array: ; at 6 [character 7 line 1]", je.getMessage());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenInvalidInputArrayWithNumericStrings_testStrictModeTrue_shouldThrowInvalidCharacterErrorMessage() {
|
||||
JSONParserConfiguration jsonParserConfiguration = new JSONParserConfiguration()
|
||||
.withStrictMode(true);
|
||||
|
||||
String testCase = "[\"1\",\"2\"];[3,4]";
|
||||
|
||||
JSONException je = assertThrows("expected non-compliant array but got instead: " + testCase,
|
||||
JSONException.class, () -> new JSONArray(testCase, jsonParserConfiguration));
|
||||
|
||||
assertEquals("invalid character found after end of array: ; at 10 [character 11 line 1]", je.getMessage());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenInvalidInputArray_testStrictModeTrue_shouldThrowValueNotSurroundedByQuotesErrorMessage() {
|
||||
JSONParserConfiguration jsonParserConfiguration = new JSONParserConfiguration()
|
||||
.withStrictMode(true);
|
||||
|
||||
String testCase = "[{\"test\": implied}]";
|
||||
|
||||
JSONException je = assertThrows("expected non-compliant array but got instead: " + testCase,
|
||||
JSONException.class, () -> new JSONArray(testCase, jsonParserConfiguration));
|
||||
|
||||
assertEquals("Value is not surrounded by quotes: implied", je.getMessage());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenInvalidInputArray_testStrictModeFalse_shouldNotThrowAnyException() {
|
||||
JSONParserConfiguration jsonParserConfiguration = new JSONParserConfiguration()
|
||||
.withStrictMode(false);
|
||||
|
||||
String testCase = "[{\"test\": implied}]";
|
||||
|
||||
new JSONArray(testCase, jsonParserConfiguration);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenNonCompliantQuotes_testStrictModeTrue_shouldThrowJsonExceptionWithConcreteErrorDescription() {
|
||||
JSONParserConfiguration jsonParserConfiguration = new JSONParserConfiguration()
|
||||
.withStrictMode(true);
|
||||
|
||||
String testCaseOne = "[\"abc', \"test\"]";
|
||||
String testCaseTwo = "['abc\", \"test\"]";
|
||||
String testCaseThree = "['abc']";
|
||||
String testCaseFour = "[{'testField': \"testValue\"}]";
|
||||
|
||||
JSONException jeOne = assertThrows(JSONException.class,
|
||||
() -> new JSONArray(testCaseOne, jsonParserConfiguration));
|
||||
JSONException jeTwo = assertThrows(JSONException.class,
|
||||
() -> new JSONArray(testCaseTwo, jsonParserConfiguration));
|
||||
JSONException jeThree = assertThrows(JSONException.class,
|
||||
() -> new JSONArray(testCaseThree, jsonParserConfiguration));
|
||||
JSONException jeFour = assertThrows(JSONException.class,
|
||||
() -> new JSONArray(testCaseFour, jsonParserConfiguration));
|
||||
|
||||
assertEquals(
|
||||
"Field contains unbalanced quotes. Starts with \" but ends with single quote. at 6 [character 7 line 1]",
|
||||
jeOne.getMessage());
|
||||
assertEquals(
|
||||
"Single quote wrap not allowed in strict mode at 2 [character 3 line 1]",
|
||||
jeTwo.getMessage());
|
||||
assertEquals(
|
||||
"Single quote wrap not allowed in strict mode at 2 [character 3 line 1]",
|
||||
jeThree.getMessage());
|
||||
assertEquals(
|
||||
"Single quote wrap not allowed in strict mode at 3 [character 4 line 1]",
|
||||
jeFour.getMessage());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenUnbalancedQuotes_testStrictModeFalse_shouldThrowJsonException() {
|
||||
JSONParserConfiguration jsonParserConfiguration = new JSONParserConfiguration()
|
||||
.withStrictMode(false);
|
||||
|
||||
String testCaseOne = "[\"abc', \"test\"]";
|
||||
String testCaseTwo = "['abc\", \"test\"]";
|
||||
|
||||
JSONException jeOne = assertThrows(JSONException.class,
|
||||
() -> new JSONArray(testCaseOne, jsonParserConfiguration));
|
||||
JSONException jeTwo = assertThrows(JSONException.class,
|
||||
() -> new JSONArray(testCaseTwo, jsonParserConfiguration));
|
||||
|
||||
assertEquals("Expected a ',' or ']' at 10 [character 11 line 1]", jeOne.getMessage());
|
||||
assertEquals("Unterminated string. Character with int code 0 is not allowed within a quoted string. at 15 [character 16 line 1]", jeTwo.getMessage());
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void givenInvalidInputArray_testStrictModeTrue_shouldThrowKeyNotSurroundedByQuotesErrorMessage() {
|
||||
JSONParserConfiguration jsonParserConfiguration = new JSONParserConfiguration()
|
||||
.withStrictMode(true);
|
||||
|
||||
String testCase = "[{test: implied}]";
|
||||
JSONException je = assertThrows("expected non-compliant array but got instead: " + testCase,
|
||||
JSONException.class, () -> new JSONArray(testCase, jsonParserConfiguration));
|
||||
|
||||
assertEquals(String.format("Value is not surrounded by quotes: %s", "test"), je.getMessage());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void verifyDuplicateKeyThenMaxDepth() {
|
||||
JSONParserConfiguration jsonParserConfiguration = new JSONParserConfiguration()
|
||||
.withOverwriteDuplicateKey(true)
|
||||
.withMaxNestingDepth(42);
|
||||
.withOverwriteDuplicateKey(true)
|
||||
.withMaxNestingDepth(42);
|
||||
|
||||
assertEquals(42, jsonParserConfiguration.getMaxNestingDepth());
|
||||
assertTrue(jsonParserConfiguration.isOverwriteDuplicateKey());
|
||||
@@ -193,28 +37,10 @@ public class JSONParserConfigurationTest {
|
||||
@Test
|
||||
public void verifyMaxDepthThenDuplicateKey() {
|
||||
JSONParserConfiguration jsonParserConfiguration = new JSONParserConfiguration()
|
||||
.withMaxNestingDepth(42)
|
||||
.withOverwriteDuplicateKey(true);
|
||||
.withMaxNestingDepth(42)
|
||||
.withOverwriteDuplicateKey(true);
|
||||
|
||||
assertTrue(jsonParserConfiguration.isOverwriteDuplicateKey());
|
||||
assertEquals(42, jsonParserConfiguration.getMaxNestingDepth());
|
||||
}
|
||||
|
||||
/**
|
||||
* This method contains short but focused use-case samples and is exclusively used to test strictMode unit tests in
|
||||
* this class.
|
||||
*
|
||||
* @return List with JSON strings.
|
||||
*/
|
||||
private List<String> getNonCompliantJSONList() {
|
||||
return Arrays.asList(
|
||||
"[1,2];[3,4]",
|
||||
"[test]",
|
||||
"[{'testSingleQuote': 'testSingleQuote'}]",
|
||||
"[1, 2,3]:[4,5]",
|
||||
"[{test: implied}]",
|
||||
"[{\"test\": implied}]",
|
||||
"[{\"number\":\"7990154836330\",\"color\":'c'},{\"number\":8784148854580,\"color\":RosyBrown},{\"number\":\"5875770107113\",\"color\":\"DarkSeaGreen\"}]",
|
||||
"[{test: \"implied\"}]");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,317 +0,0 @@
|
||||
[
|
||||
{
|
||||
"_id": "6606c27d2ab4a0102d49420a",
|
||||
"index": 0,
|
||||
"guid": "441331fb-84d1-4873-a649-3814621a0370",
|
||||
"isActive": true,
|
||||
"balance": "$2,691.63",
|
||||
"picture": "http://example.abc/32x32",
|
||||
"age": 26,
|
||||
"eyeColor": "blue",
|
||||
"name": "abc",
|
||||
"gender": "female",
|
||||
"company": "example",
|
||||
"email": "abc@def.com",
|
||||
"phone": "+1 (123) 456-7890",
|
||||
"address": "123 Main St",
|
||||
"about": "Laborum magna tempor officia irure cillum nulla incididunt Lorem dolor veniam elit cupidatat amet. Veniam veniam exercitation nulla consectetur officia esse ex sunt nulla nisi ea cillum nisi reprehenderit. Qui aliquip reprehenderit aliqua aliquip aliquip anim sit magna nostrud dolore veniam velit elit aliquip.\r\n",
|
||||
"registered": "2016-07-22T03:18:11 -01:00",
|
||||
"latitude": -21.544934,
|
||||
"longitude": 72.765495,
|
||||
"tags": [
|
||||
"consectetur",
|
||||
"minim",
|
||||
"sunt",
|
||||
"in",
|
||||
"ut",
|
||||
"velit",
|
||||
"anim"
|
||||
],
|
||||
"friends": [
|
||||
{
|
||||
"id": 0,
|
||||
"name": "abc def"
|
||||
},
|
||||
{
|
||||
"id": 1,
|
||||
"name": "ghi jkl"
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"name": "mno pqr"
|
||||
}
|
||||
],
|
||||
"greeting": "Hello, abc! You have 10 unread messages.",
|
||||
"favoriteFruit": "banana"
|
||||
},
|
||||
{
|
||||
"_id": "6606c27d0a45df5121fb765f",
|
||||
"index": 1,
|
||||
"guid": "fd774715-de85-44b9-b498-c214d8f68d9f",
|
||||
"isActive": true,
|
||||
"balance": "$2,713.96",
|
||||
"picture": "http://placehold.it/32x32",
|
||||
"age": 27,
|
||||
"eyeColor": "green",
|
||||
"name": "def",
|
||||
"gender": "female",
|
||||
"company": "sample",
|
||||
"email": "def@abc.com",
|
||||
"phone": "+1 (123) 456-78910",
|
||||
"address": "1234 Main St",
|
||||
"about": "Ea id cupidatat eiusmod culpa. Nulla consequat esse elit enim et pariatur eiusmod ipsum. Consequat eu non reprehenderit in.\r\n",
|
||||
"registered": "2015-04-06T07:54:22 -01:00",
|
||||
"latitude": 83.512347,
|
||||
"longitude": -9.368739,
|
||||
"tags": [
|
||||
"excepteur",
|
||||
"non",
|
||||
"nostrud",
|
||||
"laboris",
|
||||
"laboris",
|
||||
"qui",
|
||||
"aute"
|
||||
],
|
||||
"friends": [
|
||||
{
|
||||
"id": 0,
|
||||
"name": "sample example"
|
||||
},
|
||||
{
|
||||
"id": 1,
|
||||
"name": "test name"
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"name": "aaa aaaa"
|
||||
}
|
||||
],
|
||||
"greeting": "Hello, test! You have 7 unread messages.",
|
||||
"favoriteFruit": "apple"
|
||||
},
|
||||
{
|
||||
"_id": "6606c27dfb3a0e4e7e7183d3",
|
||||
"index": 2,
|
||||
"guid": "688b0c36-98e0-4ee7-86b8-863638d79b5f",
|
||||
"isActive": false,
|
||||
"balance": "$3,514.35",
|
||||
"picture": "http://placehold.it/32x32",
|
||||
"age": 32,
|
||||
"eyeColor": "green",
|
||||
"name": "test",
|
||||
"gender": "female",
|
||||
"company": "test",
|
||||
"email": "test@test.com",
|
||||
"phone": "+1 (123) 456-7890",
|
||||
"address": "123 Main St",
|
||||
"about": "Mollit officia adipisicing ex nisi non Lorem sunt quis est. Irure exercitation duis ipsum qui ullamco eu ea commodo occaecat minim proident. Incididunt nostrud ex cupidatat eiusmod mollit anim irure culpa. Labore voluptate voluptate labore nisi sit eu. Dolor sit proident velit dolor deserunt labore sit ipsum incididunt eiusmod reprehenderit voluptate. Duis anim velit officia laboris consequat officia dolor sint dolor nisi ex.\r\n",
|
||||
"registered": "2021-11-02T12:50:05 -00:00",
|
||||
"latitude": -82.969939,
|
||||
"longitude": 86.415645,
|
||||
"tags": [
|
||||
"aliquip",
|
||||
"et",
|
||||
"est",
|
||||
"nulla",
|
||||
"nulla",
|
||||
"tempor",
|
||||
"adipisicing"
|
||||
],
|
||||
"friends": [
|
||||
{
|
||||
"id": 0,
|
||||
"name": "test"
|
||||
},
|
||||
{
|
||||
"id": 1,
|
||||
"name": "sample"
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"name": "example"
|
||||
}
|
||||
],
|
||||
"greeting": "Hello, test! You have 1 unread messages.",
|
||||
"favoriteFruit": "strawberry"
|
||||
},
|
||||
{
|
||||
"_id": "6606c27d204bc2327fc9ba23",
|
||||
"index": 3,
|
||||
"guid": "be970cba-306e-4cbd-be08-c265a43a61fa",
|
||||
"isActive": true,
|
||||
"balance": "$3,691.63",
|
||||
"picture": "http://placehold.it/32x32",
|
||||
"age": 35,
|
||||
"eyeColor": "brown",
|
||||
"name": "another test",
|
||||
"gender": "male",
|
||||
"company": "TEST",
|
||||
"email": "anothertest@anothertest.com",
|
||||
"phone": "+1 (321) 987-6543",
|
||||
"address": "123 Example Main St",
|
||||
"about": "Do proident consectetur minim quis. In adipisicing culpa Lorem fugiat cillum exercitation velit velit. Non voluptate laboris deserunt veniam et sint consectetur irure aliqua quis eiusmod consectetur elit id. Ex sint do anim Lorem excepteur eu nulla.\r\n",
|
||||
"registered": "2020-06-25T04:55:25 -01:00",
|
||||
"latitude": 63.614955,
|
||||
"longitude": -109.299405,
|
||||
"tags": [
|
||||
"irure",
|
||||
"esse",
|
||||
"non",
|
||||
"mollit",
|
||||
"laborum",
|
||||
"adipisicing",
|
||||
"ad"
|
||||
],
|
||||
"friends": [
|
||||
{
|
||||
"id": 0,
|
||||
"name": "test"
|
||||
},
|
||||
{
|
||||
"id": 1,
|
||||
"name": "sample"
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"name": "example"
|
||||
}
|
||||
],
|
||||
"greeting": "Hello, another test! You have 5 unread messages.",
|
||||
"favoriteFruit": "apple"
|
||||
},
|
||||
{
|
||||
"_id": "6606c27df63eb5f390cb9989",
|
||||
"index": 4,
|
||||
"guid": "2c3e5115-758d-468e-99c5-c9afa26e1f9f",
|
||||
"isActive": true,
|
||||
"balance": "$1,047.20",
|
||||
"picture": "http://test.it/32x32",
|
||||
"age": 30,
|
||||
"eyeColor": "green",
|
||||
"name": "Test Name",
|
||||
"gender": "female",
|
||||
"company": "test",
|
||||
"email": "testname@testname.com",
|
||||
"phone": "+1 (999) 999-9999",
|
||||
"address": "999 Test Main St",
|
||||
"about": "Voluptate exercitation tempor consectetur velit magna ea occaecat cupidatat consectetur anim aute. Aliquip est aute ipsum laboris non irure qui consectetur tempor quis do ea Lorem. Cupidatat exercitation ad culpa aliqua amet commodo mollit reprehenderit exercitation adipisicing amet et laborum pariatur.\r\n",
|
||||
"registered": "2023-01-19T02:43:18 -00:00",
|
||||
"latitude": 14.15208,
|
||||
"longitude": 170.411535,
|
||||
"tags": [
|
||||
"dolor",
|
||||
"qui",
|
||||
"cupidatat",
|
||||
"aliqua",
|
||||
"laboris",
|
||||
"reprehenderit",
|
||||
"sint"
|
||||
],
|
||||
"friends": [
|
||||
{
|
||||
"id": 0,
|
||||
"name": "test"
|
||||
},
|
||||
{
|
||||
"id": 1,
|
||||
"name": "sample"
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"name": "example"
|
||||
}
|
||||
],
|
||||
"greeting": "Hello, test! You have 6 unread messages.",
|
||||
"favoriteFruit": "apple"
|
||||
},
|
||||
{
|
||||
"_id": "6606c27d01d19fa29853d59c",
|
||||
"index": 5,
|
||||
"guid": "816cda74-5d4b-498f-9724-20f340d5f5bf",
|
||||
"isActive": false,
|
||||
"balance": "$2,628.74",
|
||||
"picture": "http://testing.it/32x32",
|
||||
"age": 28,
|
||||
"eyeColor": "green",
|
||||
"name": "Testing",
|
||||
"gender": "female",
|
||||
"company": "test",
|
||||
"email": "testing@testing.com",
|
||||
"phone": "+1 (888) 888-8888",
|
||||
"address": "123 Main St",
|
||||
"about": "Cupidatat non ut nulla qui excepteur in minim non et nulla fugiat. Dolor quis laborum occaecat veniam dolor ullamco deserunt amet veniam dolor quis proident tempor laboris. In cillum duis ut quis. Aliqua cupidatat magna proident velit tempor veniam et consequat laborum ex dolore qui. Incididunt deserunt magna minim Lorem consectetur.\r\n",
|
||||
"registered": "2017-10-14T11:14:08 -01:00",
|
||||
"latitude": -5.345728,
|
||||
"longitude": -9.706491,
|
||||
"tags": [
|
||||
"officia",
|
||||
"velit",
|
||||
"laboris",
|
||||
"qui",
|
||||
"cupidatat",
|
||||
"cupidatat",
|
||||
"ad"
|
||||
],
|
||||
"friends": [
|
||||
{
|
||||
"id": 0,
|
||||
"name": "test"
|
||||
},
|
||||
{
|
||||
"id": 1,
|
||||
"name": "sample"
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"name": "example"
|
||||
}
|
||||
],
|
||||
"greeting": "Hello, testing! You have 2 unread messages.",
|
||||
"favoriteFruit": "strawberry"
|
||||
},
|
||||
{
|
||||
"_id": "6606c27d803003cede1d6deb",
|
||||
"index": 6,
|
||||
"guid": "4ee550bc-0920-4104-b3ce-ebf9db6a803f",
|
||||
"isActive": true,
|
||||
"balance": "$1,709.31",
|
||||
"picture": "http://sample.it/32x32",
|
||||
"age": 31,
|
||||
"eyeColor": "blue",
|
||||
"name": "Sample Name",
|
||||
"gender": "female",
|
||||
"company": "Sample",
|
||||
"email": "sample@sample.com",
|
||||
"phone": "+1 (777) 777-7777",
|
||||
"address": "123 Main St",
|
||||
"about": "Lorem ex proident ipsum ullamco velit sit nisi eiusmod cillum. Id tempor irure culpa nisi sit non qui veniam non ut. Aliquip reprehenderit excepteur mollit quis excepteur ex sit. Quis do eu veniam do ullamco occaecat eu cupidatat nisi laborum tempor minim fugiat pariatur. Ex in nulla ex velit.\r\n",
|
||||
"registered": "2019-04-08T03:54:36 -01:00",
|
||||
"latitude": -70.660321,
|
||||
"longitude": 71.547525,
|
||||
"tags": [
|
||||
"consequat",
|
||||
"veniam",
|
||||
"pariatur",
|
||||
"aliqua",
|
||||
"cillum",
|
||||
"eu",
|
||||
"officia"
|
||||
],
|
||||
"friends": [
|
||||
{
|
||||
"id": 0,
|
||||
"name": "Test"
|
||||
},
|
||||
{
|
||||
"id": 1,
|
||||
"name": "Sample"
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"name": "Example"
|
||||
}
|
||||
],
|
||||
"greeting": "Hello, Sample! You have 6 unread messages.",
|
||||
"favoriteFruit": "apple"
|
||||
}
|
||||
]
|
||||
Reference in New Issue
Block a user