serde-rs / json

Strongly typed JSON library for Rust
Apache License 2.0
4.7k stars 536 forks source link

json serialization compatible problem #1121

Closed kwsc98 closed 3 months ago

kwsc98 commented 3 months ago

For example, in java interactions, fields of type String are serialized directly to sds instead of /"sds/", and using serde results in an error when serialization fails expected value at line 1 column 1 Hopefully this is compatible

TinusgragLin commented 3 months ago

Can not reproduce this on my end. Using the latest version of serde and serde_json and this simple test code:

use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize)]
struct Test {
    sds: String
}
fn main() {
    let test = Test { sds: "sds".to_string() };
    let res = serde_json::to_string(&test).unwrap();
    println!("{}", res);
}

yields:

{"sds":"sds"}

as expected, please provide more information and perhaps an simple example illustrating your issue.

kwsc98 commented 3 months ago

like

    let str = "sds";
    let str_json = serde_json::to_string(str).unwrap();
    println!("{:?}", str_json); //   "\"sds\""
    let res: Result<String, serde_json::Error> = serde_json::from_str(str);
    println!("{:?}", res); //  Err(Error("expected value", line: 1, column: 1))
TinusgragLin commented 3 months ago

serde_json::from_str() deserialize a structure from a json string. I don't think

sds

is a valid json string.

TinusgragLin commented 3 months ago

Oh, I guess you have confused "the string type in json" (i.e. the "value" in {"field": "value"}) with "a string that is in the json format" (i.e. {"field": "value"} as a whole), am I right?

It's indeed better for serde_json::{to_string, from_str} to be renamed to serde_json::{to_json, from_json} IMO, but that would be a breaking change and the documentation clarifies things most of the time anyway.

kwsc98 commented 3 months ago

I have a project that communicates with Java projects, and in some Java json parsing libraries, the String type is treated directly as sds Instead of \"sds\" so

let res: Result<String, serde_json::Error> = serde_json::from_str("sds");
println!("{:?}", res); //  Err(Error("expected value", line: 1, column: 1))

let res: Result<String, serde_json::Error> = serde_json::from_str("\"sds\"");
println!("{:?}", res); //  Ok("sds")

Now I receive a Java response that I must process before I can use serde_json like

pub fn json_field_compatible(ty: &str, mut field: String) -> String {
    if ty == "String" && !field.starts_with("\"") {
        field.insert(0, '\"');
        field.insert(field.len(), '\"');
    }
    field
}
TinusgragLin commented 3 months ago

... the String type treated directly as sds instead of "sds"

Such implementation would be incompatible with the JSON format specification, as both RFC 8259 and ECMA-404 define string as:

'"' characters '"'

Here is a simple JSON format verifier if you don't want to look into the specs (remember to uncheck the Fix JSON option as this will enable auto-correction).

kwsc98 commented 3 months ago

i know , so i hope have like a "Fix JSON" Feature,

TinusgragLin commented 3 months ago

In that case, you probably should change your title to "Feature request: apply simple auto-corrections when deserialize", though I don't think that would be accepted.

dtolnay commented 3 months ago

Deserializing things other than JSON is out of scope for this library.