Every JSON object/array value mineable from possibly-dirty text, in document order (direct parse, code fences, then all balanced `{...}` / `[...]`). Deduped.
(text: &str)
| 1035 | /// Every JSON object/array value mineable from possibly-dirty text, in document order |
| 1036 | /// (direct parse, code fences, then all balanced `{...}` / `[...]`). Deduped. |
| 1037 | fn extract_all_json_values(text: &str) -> Vec<Value> { |
| 1038 | let trimmed = text.trim(); |
| 1039 | let mut values: Vec<Value> = Vec::new(); |
| 1040 | let consider = |candidate: &str, values: &mut Vec<Value>| { |
| 1041 | if let Ok(v) = serde_json::from_str::<Value>(candidate.trim()) { |
| 1042 | if (v.is_object() || v.is_array()) && !values.contains(&v) { |
| 1043 | values.push(v); |
| 1044 | } |
| 1045 | } |
| 1046 | }; |
| 1047 | consider(trimmed, &mut values); |
| 1048 | if let Some(inner) = strip_code_fence(trimmed) { |
| 1049 | consider(inner, &mut values); |
| 1050 | } |
| 1051 | for candidate in find_all_balanced(trimmed, '{', '}') { |
| 1052 | consider(&candidate, &mut values); |
| 1053 | } |
| 1054 | for candidate in find_all_balanced(trimmed, '[', ']') { |
| 1055 | consider(&candidate, &mut values); |
| 1056 | } |
| 1057 | values |
| 1058 | } |
| 1059 | |
| 1060 | /// Try every raw candidate × every JSON value it yields against the schema; return the |
| 1061 | /// first schema-valid object, else the best parseable-but-invalid object (for repair). |