MCPcopy Create free account
hub / github.com/AI45Lab/Code / extract_json_value

Function extract_json_value

core/src/llm/structured.rs:299–333  ·  view source on GitHub ↗

Extract a JSON value from potentially dirty LLM output. Handles: raw JSON, markdown code fences, leading/trailing prose.

(text: &str)

Source from the content-addressed store, hash-verified

297///
298/// Handles: raw JSON, markdown code fences, leading/trailing prose.
299pub fn extract_json_value(text: &str) -> Result<Value> {
300 let trimmed = text.trim();
301
302 // 1. Direct parse
303 if let Ok(v) = serde_json::from_str::<Value>(trimmed) {
304 if v.is_object() || v.is_array() {
305 return Ok(v);
306 }
307 }
308
309 // 2. Strip markdown code fence
310 if let Some(inner) = strip_code_fence(trimmed) {
311 if let Ok(v) = serde_json::from_str::<Value>(inner.trim()) {
312 if v.is_object() || v.is_array() {
313 return Ok(v);
314 }
315 }
316 }
317
318 // 3. Find balanced JSON substring (first { to matching })
319 if let Some(candidate) = find_balanced_json_object(trimmed) {
320 if let Ok(v) = serde_json::from_str::<Value>(candidate) {
321 return Ok(v);
322 }
323 }
324
325 // 4. Try array
326 if let Some(candidate) = find_balanced_json_array(trimmed) {
327 if let Ok(v) = serde_json::from_str::<Value>(candidate) {
328 return Ok(v);
329 }
330 }
331
332 bail!("No valid JSON object found in LLM output")
333}
334
335/// Strip ```json ... ``` or ``` ... ``` fences.
336fn strip_code_fence(text: &str) -> Option<&str> {

Calls 3

strip_code_fenceFunction · 0.85
find_balanced_json_arrayFunction · 0.85