Skip to content

Commit 18ace95

Browse files
committed
Fix: json to_string function adds backslash for escaped characters
1 parent 2d45417 commit 18ace95

File tree

4 files changed

+33
-28
lines changed

4 files changed

+33
-28
lines changed

src/de.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ impl<'a> Decoder<'a> {
111111
FALSE_TAG => Ok(Value::Bool(false)),
112112
STRING_TAG => {
113113
let offset = jentry.length as usize;
114-
let s = std::str::from_utf8(&self.buf[..offset]).unwrap();
114+
let s = unsafe { std::str::from_utf8_unchecked(&self.buf[..offset]) };
115115
self.buf = &self.buf[offset..];
116116
Ok(Value::String(Cow::Borrowed(s)))
117117
}

src/functions.rs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -792,10 +792,16 @@ pub fn as_str(value: &[u8]) -> Option<Cow<'_, str>> {
792792
pub fn to_str(value: &[u8]) -> Result<String, Error> {
793793
if let Some(v) = as_str(value) {
794794
return Ok(v.to_string());
795-
} else if is_null(value) {
796-
return Err(Error::InvalidCast);
795+
} else if let Some(v) = as_bool(value) {
796+
if v {
797+
return Ok("true".to_string());
798+
} else {
799+
return Ok("false".to_string());
800+
}
801+
} else if let Some(v) = as_number(value) {
802+
return Ok(format!("{}", v));
797803
}
798-
Ok(to_string(value))
804+
Err(Error::InvalidCast)
799805
}
800806

801807
/// Returns true if the `JSONB` is An Array. Returns false otherwise.
@@ -878,9 +884,7 @@ fn container_to_string(value: &[u8], offset: &mut usize, json: &mut String) {
878884
json.push(',');
879885
}
880886
let key = keys.pop_front().unwrap();
881-
json.push('\"');
882-
json.push_str(key);
883-
json.push('\"');
887+
json.extend(format!("{:?}", key).chars());
884888
json.push(':');
885889
scalar_to_string(value, &mut jentry_offset, &mut value_offset, json);
886890
}
@@ -911,9 +915,7 @@ fn scalar_to_string(
911915
let val = unsafe {
912916
std::str::from_utf8_unchecked(&value[*value_offset..*value_offset + length])
913917
};
914-
json.push('\"');
915-
json.push_str(val);
916-
json.push('\"');
918+
json.extend(format!("{:?}", val).chars());
917919
}
918920
CONTAINER_TAG => {
919921
container_to_string(value, value_offset, json);

src/value.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,7 @@ impl<'a> Display for Value<'a> {
6969
}
7070
Value::Number(ref v) => write!(f, "{}", v),
7171
Value::String(ref v) => {
72-
write!(f, "\"")?;
73-
write!(f, "{v}")?;
74-
write!(f, "\"")
72+
write!(f, "{:?}", v)
7573
}
7674
Value::Array(ref vs) => {
7775
let mut first = true;

tests/it/functions.rs

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -654,26 +654,31 @@ fn test_to_type() {
654654
#[test]
655655
fn test_to_string() {
656656
let sources = vec![
657-
r#"null"#,
658-
r#"true"#,
659-
r#"false"#,
660-
r#"1234567"#,
661-
r#"-1234567"#,
662-
r#"123.4567"#,
663-
r#""abcdef""#,
664-
r#"[1,2,3,4]"#,
665-
r#"["a","b",true,false,[1,2,3],{"a":"b"}]"#,
666-
r#"{"k1":"v1","k2":[1,2,3],"k3":{"a":"b"}}"#,
657+
(r#"null"#, r#"null"#),
658+
(r#"true"#, r#"true"#),
659+
(r#"false"#, r#"false"#),
660+
(r#"1234567"#, r#"1234567"#),
661+
(r#"-1234567"#, r#"-1234567"#),
662+
(r#"123.4567"#, r#"123.4567"#),
663+
(r#""abcdef""#, r#""abcdef""#),
664+
(r#""ab\n\"\uD83D\uDC8E测试""#, r#""ab\n\"💎测试""#),
665+
(r#"[1,2,3,4]"#, r#"[1,2,3,4]"#),
666+
(
667+
r#"["a","b",true,false,[1,2,3],{"a":"b"}]"#,
668+
r#"["a","b",true,false,[1,2,3],{"a":"b"}]"#,
669+
),
670+
(
671+
r#"{"k1":"v1","k2":[1,2,3],"k3":{"a":"b"}}"#,
672+
r#"{"k1":"v1","k2":[1,2,3],"k3":{"a":"b"}}"#,
673+
),
667674
];
668675
let mut buf: Vec<u8> = Vec::new();
669-
for s in sources {
670-
let res = to_string(s.as_bytes());
671-
assert_eq!(res, s.to_string());
672-
676+
for (s, expect) in sources {
673677
let value = parse_value(s.as_bytes()).unwrap();
678+
assert_eq!(format!("{}", value), expect);
674679
value.write_to_vec(&mut buf);
675680
let res = to_string(&buf);
676-
assert_eq!(res, s.to_string());
681+
assert_eq!(res, expect);
677682
buf.clear();
678683
}
679684
}

0 commit comments

Comments
 (0)