Movatterモバイル変換


[0]ホーム

URL:


Docs.rs

Crate serde_json

Crateserde_json 

Source
Expand description

§Serde JSON

JSON is a ubiquitous open-standard format that uses human-readable text totransmit data objects consisting of key-value pairs.

{    "name": "John Doe",    "age": 43,    "address": {        "street": "10 Downing Street",        "city": "London"    },    "phones": [        "+44 1234567",        "+44 2345678"    ]}

There are three common ways that you might find yourself needing to workwith JSON data in Rust.

  • As text data. An unprocessed string of JSON data that you receive onan HTTP endpoint, read from a file, or prepare to send to a remoteserver.
  • As an untyped or loosely typed representation. Maybe you want tocheck that some JSON data is valid before passing it on, but withoutknowing the structure of what it contains. Or you want to do very basicmanipulations like insert a key in a particular spot.
  • As a strongly typed Rust data structure. When you expect all or mostof your data to conform to a particular structure and want to get realwork done without JSON’s loosey-goosey nature tripping you up.

Serde JSON provides efficient, flexible, safe ways of converting databetween each of these representations.

§Operating on untyped JSON values

Any valid JSON data can be manipulated in the following recursive enumrepresentation. This data structure isserde_json::Value.

enumValue {    Null,    Bool(bool),    Number(Number),    String(String),    Array(Vec<Value>),    Object(Map<String, Value>),}

A string of JSON data can be parsed into aserde_json::Value by theserde_json::from_str function. There is alsofrom_slicefor parsing from a byte slice&[u8] andfrom_reader for parsing fromanyio::Read like a File or a TCP stream.

useserde_json::{Result, Value};fnuntyped_example() ->Result<()> {// Some JSON input data as a &str. Maybe this comes from the user.letdata =r#"        {            "name": "John Doe",            "age": 43,            "phones": [                "+44 1234567",                "+44 2345678"            ]        }"#;// Parse the string of data into serde_json::Value.letv: Value = serde_json::from_str(data)?;// Access parts of the data by indexing with square brackets.println!("Please call {} at the number {}", v["name"], v["phones"][0]);Ok(())}

The result of square bracket indexing likev["name"] is a borrow of thedata at that index, so the type is&Value. A JSON map can be indexed withstring keys, while a JSON array can be indexed with integer keys. If thetype of the data is not right for the type with which it is being indexed,or if a map does not contain the key being indexed, or if the index into avector is out of bounds, the returned element isValue::Null.

When aValue is printed, it is printed as a JSON string. So in the codeabove, the output looks likePlease call "John Doe" at the number "+44 1234567". The quotation marks appear becausev["name"] is a&Valuecontaining a JSON string and its JSON representation is"John Doe".Printing as a plain string without quotation marks involves converting froma JSON string to a Rust string withas_str() or avoiding the use ofValue as described in the following section.

TheValue representation is sufficient for very basic tasks but can betedious to work with for anything more significant. Error handling isverbose to implement correctly, for example imagine trying to detect thepresence of unrecognized fields in the input data. The compiler is powerlessto help you when you make a mistake, for example imagine typoingv["name"]asv["nmae"] in one of the dozens of places it is used in your code.

§Parsing JSON as strongly typed data structures

Serde provides a powerful way of mapping JSON data into Rust data structureslargely automatically.

useserde::{Deserialize, Serialize};useserde_json::Result;#[derive(Serialize, Deserialize)]structPerson {    name: String,    age: u8,    phones: Vec<String>,}fntyped_example() ->Result<()> {// Some JSON input data as a &str. Maybe this comes from the user.letdata =r#"        {            "name": "John Doe",            "age": 43,            "phones": [                "+44 1234567",                "+44 2345678"            ]        }"#;// Parse the string of data into a Person object. This is exactly the    // same function as the one that produced serde_json::Value above, but    // now we are asking it for a Person as output.letp: Person = serde_json::from_str(data)?;// Do things just like with any other Rust data structure.println!("Please call {} at the number {}", p.name, p.phones[0]);Ok(())}

This is the sameserde_json::from_str function as before, but this time weassign the return value to a variable of typePerson so Serde willautomatically interpret the input data as aPerson and produce informativeerror messages if the layout does not conform to what aPerson is expectedto look like.

Any type that implements Serde’sDeserialize trait can be deserializedthis way. This includes built-in Rust standard library types likeVec<T>andHashMap<K, V>, as well as any structs or enums annotated with#[derive(Deserialize)].

Once we havep of typePerson, our IDE and the Rust compiler can help ususe it correctly like they do for any other Rust code. The IDE canautocomplete field names to prevent typos, which was impossible in theserde_json::Value representation. And the Rust compiler can check thatwhen we writep.phones[0], thenp.phones is guaranteed to be aVec<String> so indexing into it makes sense and produces aString.

§Constructing JSON values

Serde JSON provides ajson! macro to buildserde_json::Valueobjects with very natural JSON syntax.

useserde_json::json;fnmain() {// The type of `john` is `serde_json::Value`letjohn =json!({"name":"John Doe","age":43,"phones": ["+44 1234567","+44 2345678"]    });println!("first phone number: {}", john["phones"][0]);// Convert to a string of JSON and print it outprintln!("{}", john.to_string());}

TheValue::to_string() function converts aserde_json::Value into aString of JSON text.

One neat thing about thejson! macro is that variables and expressions canbe interpolated directly into the JSON value as you are building it. Serdewill check at compile time that the value you are interpolating is able tobe represented as JSON.

letfull_name ="John Doe";letage_last_year =42;// The type of `john` is `serde_json::Value`letjohn =json!({"name": full_name,"age": age_last_year +1,"phones": [format!("+44 {}", random_phone())    ]});

This is amazingly convenient, but we have the problem we had before withValue: the IDE and Rust compiler cannot help us if we get it wrong. SerdeJSON provides a better way of serializing strongly-typed data structuresinto JSON text.

§Creating JSON by serializing data structures

A data structure can be converted to a JSON string byserde_json::to_string. There is alsoserde_json::to_vec which serializes to aVec<u8> andserde_json::to_writer which serializes to anyio::Writesuch as a File or a TCP stream.

useserde::{Deserialize, Serialize};useserde_json::Result;#[derive(Serialize, Deserialize)]structAddress {    street: String,    city: String,}fnprint_an_address() ->Result<()> {// Some data structure.letaddress = Address {        street:"10 Downing Street".to_owned(),        city:"London".to_owned(),    };// Serialize it to a JSON string.letj = serde_json::to_string(&address)?;// Print, write to a file, or send to an HTTP server.println!("{}", j);Ok(())}

Any type that implements Serde’sSerialize trait can be serialized thisway. This includes built-in Rust standard library types likeVec<T> andHashMap<K, V>, as well as any structs or enums annotated with#[derive(Serialize)].

§No-std support

As long as there is a memory allocator, it is possible to use serde_jsonwithout the rest of the Rust standard library. Disable the default “std”feature and enable the “alloc” feature:

[dependencies]serde_json = { version = "1.0", default-features = false, features = ["alloc"] }

For JSON support in Serde without a memory allocator, please see theserde-json-core crate.

Modules§

de
Deserialize JSON data to a Rust data structure.
error
When serializing or deserializing JSON goes wrong.
map
A map of String to serde_json::Value.
serstd
Serialize a Rust data structure into JSON data.
value
The Value enum, a loosely typed way of representing any valid JSON value.

Macros§

json
Construct aserde_json::Value from a JSON literal.

Structs§

Deserializer
A structure that deserializes JSON into Rust values.
Error
This type represents all possible errors that can occur when serializing ordeserializing JSON data.
Map
Represents a JSON key/value type.
Number
Represents a JSON number, whether integer or floating point.
Serializerstd
A structure for serializing Rust values into JSON.
StreamDeserializer
Iterator that deserializes a stream into multiple JSON values.

Enums§

Value
Represents any valid JSON value.

Functions§

from_readerstd
Deserialize an instance of typeT from an I/O stream of JSON.
from_slice
Deserialize an instance of typeT from bytes of JSON text.
from_str
Deserialize an instance of typeT from a string of JSON text.
from_value
Interpret aserde_json::Value as an instance of typeT.
to_stringstd
Serialize the given data structure as a String of JSON.
to_string_prettystd
Serialize the given data structure as a pretty-printed String of JSON.
to_value
Convert aT intoserde_json::Value which is an enum that can representany valid JSON data.
to_vecstd
Serialize the given data structure as a JSON byte vector.
to_vec_prettystd
Serialize the given data structure as a pretty-printed JSON byte vector.
to_writerstd
Serialize the given data structure as JSON into the I/O stream.
to_writer_prettystd
Serialize the given data structure as pretty-printed JSON into the I/Ostream.

Type Aliases§

Result
Alias for aResult with the error typeserde_json::Error.

[8]ページ先頭

©2009-2025 Movatter.jp