// include the latest version of the regex crate in your Cargo.toml
extern crate regex;
use regex::Regex;
fn main() {
let regex = Regex::new(r#"(?m)^(?:(?:(?&V_Obj)|(?&V_Ary))|(?<Invalid>(?&Er_Obj)|(?&Er_Ary))(*SKIP)(*FAIL))(?(DEFINE)(?<Sep_Ary>(?:,(?!\s*[}\]])|(?=\s*[\]])))(?<Sep_Obj>(?:,(?!\s*[}\]])|(?=\s*[}])))(?<Er_Obj>(?>{(?:\s*(?&Str)(?:\s*:(?:\s*(?:(?&Er_Value)|(?<Er_Ary>\[(?:\s*(?:(?&Er_Value)|(?&Er_Ary)|(?&Er_Obj))(?:\s*(?&Sep_Ary)|(*ACCEPT)))*(?:\s*\]|(*ACCEPT)))|(?&Er_Obj))(?:\s*(?&Sep_Obj)|(*ACCEPT))|(*ACCEPT))|(*ACCEPT)))*(?:\s*}|(*ACCEPT))))(?<Er_Value>(?>(?&Numb)|(?>true|false|null)|(?&Str)))(?<Str>(?>"[^\\"]*(?:\\[\s\S][^\\"]*)*"))(?<Numb>(?>[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?|(?:[eE][+-]?\d+)))(?<V_KeyVal>(?>\s*(?&Str)\s*:\s*(?&V_Value)\s*))(?<V_Value>(?>(?&Numb)|(?>true|false|null)|(?&Str)|(?&V_Obj)|(?&V_Ary)))(?<V_Ary>\[(?>\s*(?&V_Value)\s*(?&Sep_Ary))*\s*\])(?<V_Obj>{(?>\s*(?&V_KeyVal)\s*(?&Sep_Obj))*\s*}))"#).unwrap();
let string = "
================================
Valid JSON :
=================================
1. Nested Objects and Arrays (Company Structure)
This example demonstrates a company structure with departments, each containing a list of employees.
{
\"company\": \"Global Solutions Inc.\",
\"headquarters\": {
\"city\": \"New York\",
\"state\": \"NY\",
\"zip\": \"10001\"
},
\"departments\": [
{
\"name\": \"Engineering\",
\"manager\": {
\"id\": \"ENG001\",
\"firstName\": \"Alice\",
\"lastName\": \"Johnson\"
},
\"employees\": [
{
\"id\": \"EMP001\",
\"firstName\": \"Bob\",
\"lastName\": \"Williams\",
\"position\": \"Software Engineer\",
\"skills\": [\"Python\", \"Java\", \"SQL\"]
},
{
\"id\": \"EMP002\",
\"firstName\": \"Charlie\",
\"lastName\": \"Davis\",
\"position\": \"DevOps Engineer\",
\"skills\": [\"AWS\", \"Docker\", \"Kubernetes\"]
}
]
},
{
\"name\": \"Marketing\",
\"manager\": {
\"id\": \"MKT001\",
\"firstName\": \"David\",
\"lastName\": \"Miller\"
},
\"employees\": [
{
\"id\": \"EMP003\",
\"firstName\": \"Eve\",
\"lastName\": \"Taylor\",
\"position\": \"Marketing Specialist\",
\"skills\": [\"SEO\", \"Content Creation\"]
}
]
}
],
\"projects\": [
{
\"projectId\": \"PROJ101\",
\"projectName\": \"New Product Launch\",
\"status\": \"In Progress\",
\"teamMembers\": [\"EMP001\", \"EMP003\"]
}
]
}
2. GeoJSON Feature Collection (Geospatial Data)
This example uses the GeoJSON standard to represent a collection of geographic features.
{
\"type\": \"FeatureCollection\",
\"features\": [
{
\"type\": \"Feature\",
\"properties\": {
\"name\": \"Eiffel Tower\",
\"country\": \"France\",
\"city\": \"Paris\"
},
\"geometry\": {
\"type\": \"Point\",
\"coordinates\": [2.2945, 48.8584]
}
},
{
\"type\": \"Feature\",
\"properties\": {
\"name\": \"Central Park\",
\"country\": \"USA\",
\"city\": \"New York\"
},
\"geometry\": {
\"type\": \"Polygon\",
\"coordinates\": [
[
[-73.981, 40.768],
[-73.958, 40.796],
[-73.949, 40.793],
[-73.981, 40.768]
]
]
}
}
]
}
3. Product Catalog with Variations (E-commerce)
This JSON structure represents a product catalog with various product details and variations.
{
\"catalogId\": \"CAT001\",
\"products\": [
{
\"productId\": \"PROD001\",
\"name\": \"T-Shirt\",
\"description\": \"Comfortable cotton t-shirt.\",
\"price\": 19.99,
\"availableSizes\": [\"S\", \"M\", \"L\", \"XL\"],
\"colors\": [
{
\"name\": \"Red\",
\"hexCode\": \"#FF0000\",
\"stock\": { \"S\": 10, \"M\": 15, \"L\": 8, \"XL\": 5 }
},
{
\"name\": \"Blue\",
\"hexCode\": \"#0000FF\",
\"stock\": { \"S\": 12, \"M\": 20, \"L\": 10, \"XL\": 7 }
}
],
\"reviews\": [
{
\"userId\": \"USER001\",
\"rating\": 5,
\"comment\": \"Great quality and fit!\"
},
{
\"userId\": \"USER002\",
\"rating\": 4,
\"comment\": \"Good t-shirt, a bit pricey.\"
}
]
},
{
\"productId\": \"PROD002\",
\"name\": \"Jeans\",
\"description\": \"Classic denim jeans.\",
\"price\": 49.99,
\"availableSizes\": [\"28\", \"30\", \"32\", \"34\"],
\"colors\": [
{
\"name\": \"Indigo\",
\"hexCode\": \"#4B0082\",
\"stock\": { \"28\": 7, \"30\": 10, \"32\": 12, \"34\": 8 }
}
]
}
]
}
=========================
Invalid JSON :
=========================
These examples illustrate various ways in which a JSON file can be considered invalid according to the JSON specification. Developers often encounter these types of errors during data serialization or parsing.
-----------------
1. Missing Double Quotes around Keys:
Code
{
name: \"Alice\",
\"age\": 30,
\"city\": \"New York\"
}
Invalidity: The key name is not enclosed in double quotes, which is a requirement in JSON.
-----------------
2. Trailing Commas in Objects or Arrays:
Code
{
\"item1\": \"value1\",
\"item2\": \"value2\",
}
Invalidity: There is a trailing comma after the last key-value pair in the object.
Code
[
\"element1\",
\"element2\",
]
Invalidity: There is a trailing comma after the last element in the array.
-----------------
3. Incorrect Data Types or Values:
Code
{
\"product\": \"Laptop\",
\"price\": $1200.00,
\"available\": True
}
Invalidity: The price value $1200.00 is not a valid JSON number (currency symbols are not allowed). The available value True is not a valid JSON boolean (must be lowercase true or false).
-----------------
4. Mismatched Braces or Brackets:
Code
{
\"user\": {
\"id\": 123,
\"name\": \"Bob\",
\"details\": [
\"email\": \"bob@example.com\"
}
]
}
Invalidity: The details array contains an object that is closed with a } instead of a ], and the array itself is closed with a ] after the object, leading to a structural mismatch.
-----------------
5. Unescaped Characters within Strings:
Code
{
\"message\": \"He said, \"Hello!\"\"
}
Invalidity: The double quotes within the string \"Hello!\" are not escaped, causing a syntax error. They should be \\\"Hello!\\\".
-----------------
6. Comments within JSON:
Code
{
// This is a comment
\"data\": \"some value\"
}
Invalidity: JSON does not support comments.
-----------------
7. Missing Colons or Values in Key-Value Pairs:
Code
{
\"key1\": \"value1\",
\"key2\"
\"key3\": \"value3\"
}
Invalidity: The key2 entry is missing a colon and a value.
-----------------
8. Invalid JSON Structure (e.g., array with object syntax):
Code
[
\"item1\": \"value1\",
\"item2\": \"value2\"
]
Invalidity: An array cannot contain key-value pairs; it should contain elements directly.
{
\"key1\" : \"value1\",
\"key2\" \"lk\"
}
-----------------
{
\"key1\" : \"value1\"
\"key2\" \"lk\"
}
-----------------
{
\"key1\" : \"value1\",
\"key2\" \"lk\"
}
-----------------
{
\"key1\" : \"value1\",
\"key2\" : mj
}
-----------------
{
\"key1\" : \"value1\",
\"key2\" : \"mj
}
-----------------
{
\"key1\" : \"value1\",
\"hhh\" : [
{
\"key0\" : [{\"MMM\" : \"a\"}, \"b\",\"c\"],
\"key2\" : \"mj\",
\"key3\" :
[
-----------------
[
\"mn\"
{\"MMM\" : a\"} ,
\"b\" , \"c\"
]
";
let substitution = "$1 ERROR_here>> ";
// result will be a String with the substituted value
let result = regex.replace_all(string, substitution);
println!("{}", result);
}
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Rust, please visit: https://docs.rs/regex/latest/regex/