{"id":15893781,"url":"https://github.com/chinanf-boy/serde_json-zh","last_synced_at":"2026-05-09T00:32:10.300Z","repository":{"id":90548526,"uuid":"157817980","full_name":"chinanf-boy/serde_json-zh","owner":"chinanf-boy","description":"中文翻译:\u003cserde-rs/json\u003e *序列*化 和 *反*序列化 Rust 数据结构 :heart: 校对 ✅","archived":false,"fork":false,"pushed_at":"2019-03-29T04:48:30.000Z","size":15,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-02-08T08:47:12.888Z","etag":null,"topics":["docs","json","part","rust","zh"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/chinanf-boy.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE-APACHE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-11-16T05:38:37.000Z","updated_at":"2023-09-08T05:21:18.000Z","dependencies_parsed_at":"2023-07-18T22:31:44.066Z","dependency_job_id":null,"html_url":"https://github.com/chinanf-boy/serde_json-zh","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chinanf-boy%2Fserde_json-zh","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chinanf-boy%2Fserde_json-zh/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chinanf-boy%2Fserde_json-zh/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chinanf-boy%2Fserde_json-zh/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chinanf-boy","download_url":"https://codeload.github.com/chinanf-boy/serde_json-zh/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246866100,"owners_count":20846496,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docs","json","part","rust","zh"],"created_at":"2024-10-06T08:13:41.712Z","updated_at":"2026-05-09T00:32:05.278Z","avatar_url":"https://github.com/chinanf-boy.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# serde-rs/json [![translate-svg]][translate-list]\n\n\u003c!-- [![explain]][source]  --\u003e\n\n[explain]: http://llever.com/explain.svg\n[source]: https://github.com/chinanf-boy/Source-Explain\n[translate-svg]: http://llever.com/translate.svg\n[translate-list]: https://github.com/chinanf-boy/chinese-translate-list\n\n「 **Serde 是一个， *序列*化 和 *反*序列化 Rust 数据结构，的有效且通用框架** 」\n\n[中文](./readme.md) | [english](https://github.com/serde-rs/json)\n\n---\n\n## 校对 ✅\n\n\u003c!-- doc-templite START generated --\u003e\n\u003c!-- repo = 'serde-rs/json' --\u003e\n\u003c!-- commit = 'ffeae2f147c69fde88049904871be54dc456bb70' --\u003e\n\u003c!-- time = '2018-11-09' --\u003e\n翻译的原文 | 与日期 | 最新更新 | 更多\n---|---|---|---\n[commit] | ⏰ 2018-11-09 | ![last] | [中文翻译][translate-list]\n\n[last]: https://img.shields.io/github/last-commit/serde-rs/json.svg\n[commit]: https://github.com/serde-rs/json/tree/ffeae2f147c69fde88049904871be54dc456bb70\n\n\u003c!-- doc-templite END generated --\u003e\n\n### 贡献\n\n欢迎 👏 勘误/校对/更新贡献 😊 [具体贡献请看](https://github.com/chinanf-boy/chinese-translate-list#贡献)\n\n## 生活\n\n[If help, **buy** me coffee —— 营养跟不上了，给我来瓶营养快线吧! 💰](https://github.com/chinanf-boy/live-need-money)\n\n---\n\n\n# Serde JSON  [![Build Status]][travis] [![Latest Version]][crates.io] [![Rustc Version 1.15+]][rustc]\n\n[build status]: https://api.travis-ci.org/serde-rs/json.svg?branch=master\n[travis]: https://travis-ci.org/serde-rs/json\n[latest version]: https://img.shields.io/crates/v/serde_json.svg\n[crates.io]: https://crates.io/crates/serde_json\n[rustc version 1.15+]: https://img.shields.io/badge/rustc-1.15+-lightgray.svg\n[rustc]: https://blog.rust-lang.org/2017/02/02/Rust-1.15.html\n\n**Serde 是一个， *序列*化 和 *反*序列化 Rust 数据结构，的有效且通用框架**\n\n\n\n### 目录\n\n\u003c!-- START doctoc --\u003e\n\u003c!-- END doctoc --\u003e\n\n## Cargo.toml\n\n```toml\n[dependencies]\nserde_json = \"1.0\"\n```\n\n您可能正在寻找:\n\n- [JSON API 文档](https://docs.serde.rs/serde_json/)\n- [Serde API 文档](https://docs.serde.rs/serde/)\n- [关于 Serde 的详细文档](https://serde.rs/)\n- [配置`#[derive(Serialize, Deserialize)]`](https://serde.rs/codegen.html)\n- [Release 告示](https://github.com/serde-rs/json/releases)\n\nJSON 是一种无处不在的开放标准格式,它使用人类可读的文本来传输，键值对组成的数据对象.\n\n```json,ignore\n{\n  \"name\": \"John Doe\",\n  \"age\": 43,\n  \"address\": {\n    \"street\": \"10 Downing Street\",\n    \"city\": \"London\"\n  },\n  \"phones\": [\"+44 1234567\", \"+44 2345678\"]\n}\n```\n\n您可能会发现自己需要在 Rust 中使用 JSON 数据的三种常见方式。\n\n- **作为文本数据.**您在 HTTP 端点上，接收到未处理的 JSON 数据字符串,从文件读取或是准备发送到远程服务器。\n- **作为无类型或松散类型的表示.**也许你想在传递它之前，检查一些 JSON 数据是否有效,但是不知道它包含的内容的结构。或是您想要进行非常基本的操作,例如在特定位置插入一个key字段。\n- **作为强类型的 Rust 数据结构.**当您希望所有或大部分数据符合特定结构并，希望在 JSON 非松散结构绊脚的情况下，完成真正的工作。\n\nSerde JSON 提供了高效,灵活,安全的方法,并为它们每个表达式之间转换数据。\n\n## 对无类型的 JSON 值进行操作\n\n可以在以下，枚举泛型中操纵任何有效的 JSON 数据。这个数据结构是[`serde_json::Value`][value].\n\n```rust,ignore\nenum Value {\n    Null,\n    Bool(bool),\n    Number(Number),\n    String(String),\n    Array(Vec\u003cValue\u003e),\n    Object(Map\u003cString, Value\u003e),\n}\n```\n\n通过[`serde_json::from_str`][from_str]函数，可以将一串 JSON 数据解析为`serde_json::Value`。还有[`from_slice`][from_slice]用于字节切片\u0026[u8]的解析，和[`from_reader`][from_reader]用于解析任意`io::Read`，像一个 File 或 TCP 流。\n\n\u003ca href=\"https://play.rust-lang.org/?gist=a266662bc71712e080efbf25ce30f306\" target=\"_blank\"\u003e\n\u003cimg align=\"right\" width=\"50\" src=\"https://raw.githubusercontent.com/serde-rs/serde-rs.github.io/master/img/run.png\"\u003e\n\u003c/a\u003e\n\n```rust\nextern crate serde_json;\n\nuse serde_json::{Value, Error};\n\nfn untyped_example() -\u003e Result\u003c(), Error\u003e {\n    // 一些JSON的输入数据作为 一个 \u0026str。因可能来自用户定义.\n    let data = r#\"{\n                    \"name\": \"John Doe\",\n                    \"age\": 43,\n                    \"phones\": [\n                      \"+44 1234567\",\n                      \"+44 2345678\"\n                    ]\n                  }\"#;\n\n    // 将数据字符串解析为serde_json::Value.\n    let v: Value = serde_json::from_str(data)?;\n\n    // 得到 部分数据 , 通过 方括号中的索引.\n    println!(\"Please call {} at the number {}\", v[\"name\"], v[\"phones\"][0]);\n\n    Ok(())\n}\n```\n\n像`v[\"name\"]`这样的方括号索引的结果，就是对该索引数据的借用,所以类型是`\u0026Value`。可以使用 **字符串字段** 来索引 JSON map，而JSON 数组可以使用**整数字段**索引。如果数据的类型不适合索引的类型,或者如果映射不包含要索引的键,或者Vec数组中的索引超出范围,则返回`Value::Null`元素.\n\n当一个`Value`打印时,它打印为 JSON 字符串.所以在上面的代码中,输出看起来像`Please call \"John Doe\" at the number \"+44 1234567\"`。出现引号是因为`v[\"name\"]`是一个包含 JSON 字符串及其 JSON 表达式`\"John Doe\"`的`\u0026Value`。要打印没有引号的纯字符串，其中涉及JSON 字符串用[`as_str()`]转换为 Rust 字符串，或如下一节所述，要避免使用`Value`。\n\n[`as_str()`]: https://docs.serde.rs/serde_json/enum.Value.html#method.as_str\n\n运用`Value`枚举，对非常基本的任务来说，已经足够了，但是对于任何更重要的任务来说是单调了些的。错误处理很难正确实现,例如试想一下,试图检测输入数据中，是否存在无法识别的字段。当你犯错误时,编译器无法帮助你,如拼写错误: `v[\"name\"]`变成了`v[\"nmae\"]`，在您的代码中，像这样的索引，可能不下几十处吧。\n\n## 将 JSON 解析为强类型数据结构\n\nSerde 提供了一种将 JSON 数据，自动映射到 Rust 数据结构的强大方法.\n\n\u003ca href=\"https://play.rust-lang.org/?gist=cff572b80d3f078c942a2151e6020adc\" target=\"_blank\"\u003e\n\u003cimg align=\"right\" width=\"50\" src=\"https://raw.githubusercontent.com/serde-rs/serde-rs.github.io/master/img/run.png\"\u003e\n\u003c/a\u003e\n\n```rust\nextern crate serde;\nextern crate serde_json;\n\n#[macro_use]\nextern crate serde_derive;\n\nuse serde_json::Error;\n\n#[derive(Serialize, Deserialize)]\nstruct Person {\n    name: String,\n    age: u8,\n    phones: Vec\u003cString\u003e,\n}\n\nfn typed_example() -\u003e Result\u003c(), Error\u003e {\n    // 一些JSON的输入数据作为 一个 \u0026str。因可能来自用户定义.\n    let data = r#\"{\n                    \"name\": \"John Doe\",\n                    \"age\": 43,\n                    \"phones\": [\n                      \"+44 1234567\",\n                      \"+44 2345678\"\n                    ]\n                  }\"#;\n\n    // 将数据字符串  解析 到一个 Person对象 . \n    // 这与上面生成 serde_json::Value 的函数完全相同, 但\n    // 现在 我们告诉它以 一个Person 类型返回。\n    let p: Person = serde_json::from_str(data)?;\n\n    // 就像对待 其他Rust数据结构一样。\n    println!(\"Please call {} at the number {}\", p.name, p.phones[0]);\n\n    Ok(())\n}\n```\n\n这里的`serde_json::from_str`像以前一样运行，但这次我们赋予了返回值一个`Person`类型变量，所以 Serde 会自动将输入数据解释为一个`Person`，如果布局不符合`Person`预计看起来那样，则产生信息性错误消息.\n\n任何实现 Serde `Deserialize` trait 的类型，都可以通过这种方式反序列化。这包括内置的 Rust 标准库类型`Vec\u003cT\u003e`和`HashMap\u003cK, V\u003e`，以及任何带注释`#[derive(Deserialize)]`的结构或枚举。\n\n一旦我们有了`Person`类型的`p`,我们的 IDE 和 Rust 编译器可以帮助我们正确使用它，就像它们对任何其他 Rust 代码一样。IDE 可以自动填充字段名称，以防止打字错误, 而这对`serde_json::Value`来说是不可能的。Rust 编译器可以在我们编写`p.phones[0]`时，检查它, 然后保证`p.phones`是一个`Vec\u003cString\u003e`，所以索引到它是有道理的,并返回一个`String`。\n\n## 构造 JSON 值\n\nSerde JSON 提供了一个[`json!`宏][macro]，以使建立JSON 语法的对象`serde_json::Value`变得非常自然。为了使用这个宏,`serde_json`需要，加上导入宏的`#[macro_use]`属性，否则[`json!`宏][macro]是没法使用到的。\n\n\u003ca href=\"https://play.rust-lang.org/?gist=c216d6beabd9429a6ac13b8f88938dfe\" target=\"_blank\"\u003e\n\u003cimg align=\"right\" width=\"50\" src=\"https://raw.githubusercontent.com/serde-rs/serde-rs.github.io/master/img/run.png\"\u003e\n\u003c/a\u003e\n\n```rust\n#[macro_use]\nextern crate serde_json;\n\nfn main() {\n    // `john` 类型是 `serde_json::Value`\n    let john = json!({\n      \"name\": \"John Doe\",\n      \"age\": 43,\n      \"phones\": [\n        \"+44 1234567\",\n        \"+44 2345678\"\n      ]\n    });\n\n    println!(\"first phone number: {}\", john[\"phones\"][0]);\n\n    // 将 JSON 字符串 转换 并 打印出来\n    println!(\"{}\", john.to_string());\n}\n```\n\n`Value::to_string()`函数会将一个`serde_json::Value`转换成一个`String`JSON 文本。\n\n一个巧妙的事情`json!`宏，是可以在构建 JSON 值时,将变量和表达式直接插入到 JSON 值中。Serde 将在编译时，检查您插入的值是否能够表示为 JSON.\n\n\u003ca href=\"https://play.rust-lang.org/?gist=aae3af4d274bd249d1c8a947076355f2\" target=\"_blank\"\u003e\n\u003cimg align=\"right\" width=\"50\" src=\"https://raw.githubusercontent.com/serde-rs/serde-rs.github.io/master/img/run.png\"\u003e\n\u003c/a\u003e\n\n```rust\nlet full_name = \"John Doe\";\nlet age_last_year = 42;\n\n//  `john`类型是 `serde_json::Value`\nlet john = json!({\n  \"name\": full_name,\n  \"age\": age_last_year + 1,\n  \"phones\": [\n    format!(\"+44 {}\", random_phone())\n  ]\n});\n```\n\n这非常方便,但我们以前有遇到一个`Value`问题就，是如果我们获得错误,IDE 和 Rust 编译器无法帮助我们。Serde JSON 提供了一种将强类型数据结构，序列化为 JSON 文本的更好方法.\n\n## 通过序列化数据结构来创建 JSON\n\n可以用[`serde_json::to_string`][to_string]，将数据结构转换为 JSON 字符串。还有[`serde_json::to_vec`][to_vec]能序列化成一个`Vec\u003cu8\u003e`和，[`serde_json::to_writer`][to_writer]会序列化为任意`io::Write`，例如一个 File 或 TCP 流.\n\n\u003ca href=\"https://play.rust-lang.org/?gist=40967ece79921c77fd78ebc8f177c063\" target=\"_blank\"\u003e\n\u003cimg align=\"right\" width=\"50\" src=\"https://raw.githubusercontent.com/serde-rs/serde-rs.github.io/master/img/run.png\"\u003e\n\u003c/a\u003e\n\n```rust\nextern crate serde;\nextern crate serde_json;\n\n#[macro_use]\nextern crate serde_derive;\n\nuse serde_json::Error;\n\n#[derive(Serialize, Deserialize)]\nstruct Address {\n    street: String,\n    city: String,\n}\n\nfn print_an_address() -\u003e Result\u003c(), Error\u003e {\n    // 一些数据结构\n    let address = Address {\n        street: \"10 Downing Street\".to_owned(),\n        city: \"London\".to_owned(),\n    };\n\n    // 序列化成一个 JSON string.\n    let j = serde_json::to_string(\u0026address)?;\n\n    // 然后，你就可以，打印, /写入文件 / 还能发送到HTTP服务器\n    println!(\"{}\", j);\n\n    Ok(())\n}\n```\n\n任何实现 Serde `Serialize` trait 的类型，都可以这种方式序列化.这包括内置的 Rust 标准库类型`Vec\u003cT\u003e`和`HashMap\u003cK, V\u003e`,以及任何带注释`#[derive(Serialize)]`的结构或枚举.\n\n## 性能\n\n它很快。根据数据的特征,您应该期望在每秒 500 到 1000 MB的反序列化和每秒 600 到 900 MB的序列化。这能与最快的 C 和 C ++ JSON 库竞争乐，甚至在许多用例，甚至快上 30%。基准们生活在[serde-rs/json-benchmark]repo.\n\n[serde-rs/json-benchmark]: https://github.com/serde-rs/json-benchmark\n\n## 获得帮助\n\nSerde 开发人员住在[`irc.mozilla.org`](https://wiki.mozilla.org/IRC)的 #serde 频道上。#rust 频道也是一个很好的资源,响应时间通常较快,但对 Serde 的了解较少。如果 IRC 不是你的主要方式，我们用于很乐意回应[GitHub 问题](https://github.com/serde-rs/json/issues/new).\n\n## 没有标准的支持\n\n这个箱子目前需要 Rust 标准库。对于 Serde 非标准库的的 JSON 支持,请参阅[`serde-json-core`]箱.\n\n[`serde-json-core`]: https://japaric.github.io/serde-json-core/serde_json_core/\n\n## 执照\n\nSerde JSON 根据任何一种许可\n\n- Apache License,Version 2.0,([许可证 APACHE](LICENSE-APACHE)要么\u003chttp://www.apache.org/licenses/LICENSE-2.0\u003e)\n- MIT 许可证([LICENSE-MIT](LICENSE-MIT)要么\u003chttp://opensource.org/licenses/MIT\u003e)\n\n根据你的选择.\n\n### 贡献\n\n除非您明确说明,否则您按照 Apache-2.0 许可证的规定有意提交包含在 Serde JSON 中的任何贡献应按上述方式进行双重许可,不附加任何其他条款或条件.\n\n[value]: https://docs.serde.rs/serde_json/value/enum.Value.html\n[from_str]: https://docs.serde.rs/serde_json/de/fn.from_str.html\n[from_slice]: https://docs.serde.rs/serde_json/de/fn.from_slice.html\n[from_reader]: https://docs.serde.rs/serde_json/de/fn.from_reader.html\n[to_string]: https://docs.serde.rs/serde_json/ser/fn.to_string.html\n[to_vec]: https://docs.serde.rs/serde_json/ser/fn.to_vec.html\n[to_writer]: https://docs.serde.rs/serde_json/ser/fn.to_writer.html\n[macro]: https://docs.serde.rs/serde_json/macro.json.html\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchinanf-boy%2Fserde_json-zh","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchinanf-boy%2Fserde_json-zh","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchinanf-boy%2Fserde_json-zh/lists"}