JNP
JNP

Reputation: 151

How to remove characters from specific index in String?

I have an application where I am receiving a string with some repetitive characters. I am receiving input as a String. How to remove the characters from specific index?

main.rs

fn main() {
    let s:String = "{\"name\":\"xx/yyyy/machine/zzz/test_int4\",\"status\":\"online\",\"timestamp\":\"2021-06-11 18:20:42.231770800 UTC\",\"value\":7}8668982856274}".to_string();
    println!("{}", s);
}

how can I get result

"{\"name\":\"xx/yyyy/machine/zzz/test_int4\",\"status\":\"online\",\"timestamp\":\"2021-06-11 18:20:42.231770800 UTC\",\"value\":7}"

instead of

"{\"name\":\"xx/yyyy/machine/zzz/test_int4\",\"status\":\"online\",\"timestamp\":\"2021-06-11 18:20:42.231770800 UTC\",\"value\":7}}8668982856274}"

Upvotes: 0

Views: 1513

Answers (1)

Kitsu
Kitsu

Reputation: 3445

String indexing works only with bytes, thus you need to find an index for the appropriate byte slice like this:

let mut s = "{\"name\":\"xx/yyyy/machine/zzz/test_int4\",\"status\":\"online\",\"timestamp\":\"2021-06-11 18:20:42.231770800 UTC\",\"value\":7}8668982856274}";
let closing_bracket_idx = s
    .as_bytes()
    .iter()
    .position(|&x| x == b'}')
    .map(|i| i + 1)
    .unwrap_or_else(|| s.len());
let v: serde_json::Value = serde_json::from_str(&s[..closing_bracket_idx]).unwrap();
println!("{:?}", v);

However, keep in mind, this approach doesn't really work in general for more complex cases, for example } in a json string value, or nested objects, or a type other than an object at the upmost level (e.g. [1, {2: 3}, 4]). More neat way is using parser capabilities to ignore of the trailing, as an example for serde_json:

let v = serde_json::Deserializer::from_str(s)
    .into_iter::<serde_json::Value>()
    .next()
    .expect("empty input")
    .expect("invalid json value");
println!("{:?}", v);

Upvotes: 1

Related Questions