use serde_json::{Value, Map, json}; use serde_json::Value::*; use std::string::String; fn main() { // The type of `john` is `serde_json::Value` /* let john = json!({ "name": "John Doe", "not": "fred", "age": 43, "phones": [ "+44 1234567", "+44 2345678" ] }); */ let data = r#"{ "id": "chatcmpl-9KmDSgvDNpdWzZMjNikOFzWyZRi8D", "object": "chat.completion", "created": 1714738930, "model": "gpt-4-turbo-2024-04-09", "choices": [ { "index": 0, "message": { "role": "assistant", "content": null, "tool_calls": [ { "id": "call_lPmkbGFiJkvuXvzs09uUYdzD", "type": "function", "function": { "name": "calc", "arguments": "{\"expr\":\"(60 * 24) * 265.25\"}" } } ] }, "logprobs": null, "finish_reason": "tool_calls" } ], "usage": { "prompt_tokens": 80, "completion_tokens": 23, "total_tokens": 103 }, "system_fingerprint": "fp_3450ce39d5" }"#; // Convert to a string of JSON and print it out //println!("{}", john.to_string()); let v: serde_json::Value = serde_json::from_str(data).unwrap(); //println!("{}", v.to_string()); //println!("{:?}", v["choices"]["finish_reason"].to_string()); /* let val = match v { Null => "".to_string(), Bool(ref b) => b.to_string(), Number(ref n) => n.to_string(), String(ref s) => s, Array(ref a) => format!("{a:?}"), Object(ref o) => format!("{o:?}"), }; */ //println!("{:?}", v.choices.to_string()); //println!("{:?}", val); //v.for_each(|f| println!("{f}")); println!("{:?}", finder(&v, "id")); } //fn finder(v: serde_json::Value, tag: &str) -> String { fn finder(v: &Value, tag: &str) -> String { /* fn inner_finder(v: Map, tag: &str) -> String { let val = match v { Null => "".to_string(), Bool(b) => b.to_string(), Number(n) => n.to_string(), String(s) => s, Array(a) => { match a.iter().position(|&r| r == tag) { None => "".to_string(), Some(v) => v.to_string(), } }, Object(o) => { inner_finder(o, tag) }, }; val } */ let val = match v { Null => { "".to_string() }, Bool(b) => { b.to_string() }, Number(n) => { println!("{}", n); n.to_string() }, String(s) => { println!("{}", s); s.to_string() }, Array(a) => { /* match a.iter().position(|r| r == tag) { None => "".to_string(), Some(v) => { //v.to_string() println!("--- {v}"); finder(&v.into(), tag) }, } */ for v in a { //println!("-- {v:?}"); finder(v, tag); } "".to_string() }, Object(o) => { //inner_finder(o, tag) for (k, v) in o.iter() { //println!("{k}"); finder(v, tag); } //println!("{o:?} {}", o.len()); "".to_string() }, }; val }