Struct Error

pub struct Error { /* private fields */ }

This type represents all possible errors that can occur when serializing or deserializing JSON data.

Implementations

impl Error

fn line(&self) -> usize

One-based line number at which the error was detected.

Characters in the first line of the input (before the first newline character) are in line 1.

fn column(&self) -> usize

One-based column number at which the error was detected.

The first character in the input and any characters immediately following a newline character are in column 1.

Note that errors may occur in column 0, for example if a read from an I/O stream fails immediately following a previously read newline character.

fn classify(&self) -> Category

Categorizes the cause of this error.

  • Category::Io - failure to read or write bytes on an I/O stream
  • Category::Syntax - input that is not syntactically valid JSON
  • Category::Data - input data that is semantically incorrect
  • Category::Eof - unexpected end of the input data
fn is_io(&self) -> bool

Returns true if this error was caused by a failure to read or write bytes on an I/O stream.

fn is_syntax(&self) -> bool

Returns true if this error was caused by input that was not syntactically valid JSON.

fn is_data(&self) -> bool

Returns true if this error was caused by input data that was semantically incorrect.

For example, JSON containing a number is semantically incorrect when the type being deserialized into holds a String.

fn is_eof(&self) -> bool

Returns true if this error was caused by prematurely reaching the end of the input data.

Callers that process streaming input may be interested in retrying the deserialization once more data is available.

fn io_error_kind(&self) -> Option<ErrorKind>

The kind reported by the underlying standard library I/O error, if this error was caused by a failure to read or write bytes on an I/O stream.

Example

use serde_json::Value;
use std::io::{self, ErrorKind, Read};
use std::process;

struct ReaderThatWillTimeOut<'a>(&'a [u8]);

impl<'a> Read for ReaderThatWillTimeOut<'a> {
    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
        if self.0.is_empty() {
            Err(io::Error::new(ErrorKind::TimedOut, "timed out"))
        } else {
            self.0.read(buf)
        }
    }
}

fn main() {
    let reader = ReaderThatWillTimeOut(br#" {"k": "#);

    let _: Value = match serde_json::from_reader(reader) {
        Ok(value) => value,
        Err(error) => {
            if error.io_error_kind() == Some(ErrorKind::TimedOut) {
                // Maybe this application needs to retry certain kinds of errors.

                # return;
            } else {
                eprintln!("error: {}", error);
                process::exit(1);
            }
        }
    };
}

Trait Implementations

impl Debug for Error

fn fmt(&self, f: &mut Formatter<'_>) -> Result

impl Display for Error

fn fmt(&self, f: &mut Formatter<'_>) -> Result

impl Error for Error

fn custom<T: Display>(msg: T) -> Error

impl Error for Error

fn source(&self) -> Option<&dyn Error + 'static>

impl Error for Error

fn custom<T: Display>(msg: T) -> Error
fn invalid_type(unexp: Unexpected<'_>, exp: &dyn Expected) -> Self
fn invalid_value(unexp: Unexpected<'_>, exp: &dyn Expected) -> Self

Auto Trait Implementations

impl !RefUnwindSafe for Error

impl !UnwindSafe for Error

impl Freeze for Error

impl Send for Error

impl Sync for Error

impl Unpin for Error

impl UnsafeUnpin for Error

Blanket Implementations

impl<T> Any for Error where T: 'static + ?Sized,

fn type_id(&self) -> TypeId

impl<T> Borrow<T> for Error where T: ?Sized,

fn borrow(&self) -> &T

impl<T> BorrowMut<T> for Error where T: ?Sized,

fn borrow_mut(&mut self) -> &mut T

impl<T> From<T> for Error

fn from(t: T) -> T

Returns the argument unchanged.

impl<T> ToString for Error where T: Display + ?Sized,

fn to_string(&self) -> String

impl<T, U> Into<U> for Error where U: From<T>,

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of [From]<T> for U chooses to do.

impl<T, U> TryFrom<U> for Error where U: Into<T>,

type Error = never;
fn try_from(value: U) -> Result<T, never>

impl<T, U> TryInto<U> for Error where U: TryFrom<T>,

type Error = <U as TryFrom<T>>::Error;
fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>