mirror of
https://github.com/serde-rs/json.git
synced 2025-10-03 07:46:05 +00:00
parent
d461263902
commit
6d38232a2c
23
src/de.rs
23
src/de.rs
@ -8,6 +8,7 @@
|
||||
|
||||
//! Deserialize JSON data to a Rust data structure.
|
||||
|
||||
use std::borrow::Cow;
|
||||
use std::io;
|
||||
use std::marker::PhantomData;
|
||||
use std::result;
|
||||
@ -946,6 +947,22 @@ impl<'de, R: Read<'de>> Deserializer<R> {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn deserialize_raw_value<V>(&mut self, visitor: V) -> Result<V::Value>
|
||||
where
|
||||
V: de::Visitor<'de>,
|
||||
{
|
||||
if let None = try!(self.parse_whitespace()) {
|
||||
return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
|
||||
}
|
||||
|
||||
self.read.toggle_raw_buffering();
|
||||
de::Deserializer::deserialize_any(&mut *self, de::IgnoredAny)?;
|
||||
match self.read.toggle_raw_buffering().unwrap() {
|
||||
Cow::Owned(byte_buf) => visitor.visit_byte_buf(byte_buf),
|
||||
Cow::Borrowed(bytes) => visitor.visit_borrowed_bytes(bytes),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl FromStr for Number {
|
||||
@ -1412,10 +1429,14 @@ impl<'de, 'a, R: Read<'de>> de::Deserializer<'de> for &'a mut Deserializer<R> {
|
||||
|
||||
/// Parses a newtype struct as the underlying value.
|
||||
#[inline]
|
||||
fn deserialize_newtype_struct<V>(self, _name: &str, visitor: V) -> Result<V::Value>
|
||||
fn deserialize_newtype_struct<V>(self, name: &str, visitor: V) -> Result<V::Value>
|
||||
where
|
||||
V: de::Visitor<'de>,
|
||||
{
|
||||
if name == ::raw::SERDE_STRUCT_NAME {
|
||||
return self.deserialize_raw_value(visitor);
|
||||
}
|
||||
|
||||
visitor.visit_newtype_struct(self)
|
||||
}
|
||||
|
||||
|
@ -364,7 +364,7 @@ pub use self::ser::{
|
||||
to_string, to_string_pretty, to_vec, to_vec_pretty, to_writer, to_writer_pretty, Serializer,
|
||||
};
|
||||
#[doc(inline)]
|
||||
pub use self::value::{from_value, to_value, Map, Number, Value};
|
||||
pub use self::value::{from_value, to_value, Map, Number, RawValue, Value};
|
||||
|
||||
// We only use our own error type; no need for From conversions provided by the
|
||||
// standard library's try! macro. This reduces lines of LLVM IR by 4%.
|
||||
@ -388,4 +388,5 @@ pub mod value;
|
||||
|
||||
mod iter;
|
||||
mod number;
|
||||
mod raw;
|
||||
mod read;
|
||||
|
93
src/raw.rs
Normal file
93
src/raw.rs
Normal file
@ -0,0 +1,93 @@
|
||||
use std::borrow::Cow;
|
||||
use std::fmt;
|
||||
|
||||
use serde::de::Visitor;
|
||||
use serde::{Deserialize, Deserializer, Serialize, Serializer};
|
||||
|
||||
/// Represents any valid JSON value as a series of raw bytes.
|
||||
///
|
||||
/// This type can be used to defer parsing parts of a payload until later,
|
||||
/// or to embed it verbatim into another JSON payload.
|
||||
///
|
||||
/// When serializing, a value of this type will retain its original formatting
|
||||
/// and will not be minified or pretty-printed.
|
||||
///
|
||||
/// When deserializing, this type can not be used with the `#[serde(flatten)]` attribute,
|
||||
/// as it relies on the original input buffer.
|
||||
|
||||
#[derive(Debug, Clone, PartialEq)]
|
||||
pub struct RawValue<'a>(Cow<'a, str>);
|
||||
|
||||
impl<'a> AsRef<str> for RawValue<'a> {
|
||||
fn as_ref(&self) -> &str {
|
||||
&self.0
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> fmt::Display for RawValue<'a> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
f.write_str(&self.0)
|
||||
}
|
||||
}
|
||||
|
||||
/// Not public API. Should be pub(crate).
|
||||
#[doc(hidden)]
|
||||
pub const SERDE_STRUCT_NAME: &'static str = "$__serde_private_RawValue";
|
||||
|
||||
impl<'a> Serialize for RawValue<'a> {
|
||||
#[inline]
|
||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||
where
|
||||
S: Serializer,
|
||||
{
|
||||
serializer.serialize_newtype_struct(SERDE_STRUCT_NAME, &self.0)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'de> Deserialize<'de> for RawValue<'a>
|
||||
where
|
||||
'de: 'a,
|
||||
{
|
||||
#[inline]
|
||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||
where
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
struct RawValueVisitor;
|
||||
|
||||
impl<'de> Visitor<'de> for RawValueVisitor {
|
||||
type Value = RawValue<'de>;
|
||||
|
||||
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
||||
write!(formatter, "a deserializable RawValue")
|
||||
}
|
||||
|
||||
fn visit_string<E>(self, s: String) -> Result<Self::Value, E>
|
||||
where
|
||||
E: ::serde::de::Error,
|
||||
{
|
||||
Ok(RawValue(Cow::Owned(s)))
|
||||
}
|
||||
|
||||
fn visit_byte_buf<E>(self, b: Vec<u8>) -> Result<Self::Value, E>
|
||||
where
|
||||
E: ::serde::de::Error,
|
||||
{
|
||||
String::from_utf8(b)
|
||||
.map(|s| RawValue(Cow::Owned(s)))
|
||||
.map_err(|err| ::serde::de::Error::custom(err))
|
||||
}
|
||||
|
||||
fn visit_borrowed_bytes<E>(self, b: &'de [u8]) -> Result<Self::Value, E>
|
||||
where
|
||||
E: ::serde::de::Error,
|
||||
{
|
||||
::std::str::from_utf8(b)
|
||||
.map(|s| RawValue(Cow::Borrowed(s)))
|
||||
.map_err(|err| ::serde::de::Error::custom(err))
|
||||
}
|
||||
}
|
||||
|
||||
deserializer.deserialize_newtype_struct(SERDE_STRUCT_NAME, RawValueVisitor)
|
||||
}
|
||||
}
|
54
src/read.rs
54
src/read.rs
@ -6,6 +6,7 @@
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
use std::borrow::Cow;
|
||||
use std::ops::Deref;
|
||||
use std::{char, cmp, io, str};
|
||||
|
||||
@ -76,6 +77,13 @@ pub trait Read<'de>: private::Sealed {
|
||||
/// string until the next quotation mark but discards the data.
|
||||
#[doc(hidden)]
|
||||
fn ignore_str(&mut self) -> Result<()>;
|
||||
|
||||
/// Switch raw buffering mode on/off. When switching off, returns a copy-on-write
|
||||
/// buffer with the captured data.
|
||||
///
|
||||
/// This is used to deserialize `RawValue`.
|
||||
#[doc(hidden)]
|
||||
fn toggle_raw_buffering(&mut self) -> Option<Cow<'de, [u8]>>;
|
||||
}
|
||||
|
||||
pub struct Position {
|
||||
@ -107,6 +115,7 @@ where
|
||||
iter: LineColIterator<io::Bytes<R>>,
|
||||
/// Temporary storage of peeked byte.
|
||||
ch: Option<u8>,
|
||||
raw_buffer: Option<Vec<u8>>,
|
||||
}
|
||||
|
||||
/// JSON input source that reads from a slice of bytes.
|
||||
@ -117,6 +126,7 @@ pub struct SliceRead<'a> {
|
||||
slice: &'a [u8],
|
||||
/// Index of the *next* byte that will be returned by next() or peek().
|
||||
index: usize,
|
||||
raw_buffering_start_index: Option<usize>,
|
||||
}
|
||||
|
||||
/// JSON input source that reads from a UTF-8 string.
|
||||
@ -142,6 +152,7 @@ where
|
||||
IoRead {
|
||||
iter: LineColIterator::new(reader.bytes()),
|
||||
ch: None,
|
||||
raw_buffer: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -193,10 +204,20 @@ where
|
||||
#[inline]
|
||||
fn next(&mut self) -> io::Result<Option<u8>> {
|
||||
match self.ch.take() {
|
||||
Some(ch) => Ok(Some(ch)),
|
||||
Some(ch) => {
|
||||
if let Some(ref mut buf) = self.raw_buffer {
|
||||
buf.push(ch);
|
||||
}
|
||||
Ok(Some(ch))
|
||||
}
|
||||
None => match self.iter.next() {
|
||||
Some(Err(err)) => Err(err),
|
||||
Some(Ok(ch)) => Ok(Some(ch)),
|
||||
Some(Ok(ch)) => {
|
||||
if let Some(ref mut buf) = self.raw_buffer {
|
||||
buf.push(ch);
|
||||
}
|
||||
Ok(Some(ch))
|
||||
}
|
||||
None => Ok(None),
|
||||
},
|
||||
}
|
||||
@ -219,7 +240,11 @@ where
|
||||
|
||||
#[inline]
|
||||
fn discard(&mut self) {
|
||||
self.ch = None;
|
||||
if let Some(ch) = self.ch.take() {
|
||||
if let Some(ref mut buf) = self.raw_buffer {
|
||||
buf.push(ch);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn position(&self) -> Position {
|
||||
@ -274,6 +299,15 @@ where
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn toggle_raw_buffering(&mut self) -> Option<Cow<'de, [u8]>> {
|
||||
if let Some(buffer) = self.raw_buffer.take() {
|
||||
Some(Cow::Owned(buffer))
|
||||
} else {
|
||||
self.raw_buffer = Some(Vec::new());
|
||||
None
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
@ -284,6 +318,7 @@ impl<'a> SliceRead<'a> {
|
||||
SliceRead {
|
||||
slice: slice,
|
||||
index: 0,
|
||||
raw_buffering_start_index: None,
|
||||
}
|
||||
}
|
||||
|
||||
@ -437,6 +472,15 @@ impl<'a> Read<'a> for SliceRead<'a> {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn toggle_raw_buffering(&mut self) -> Option<Cow<'a, [u8]>> {
|
||||
if let Some(start_index) = self.raw_buffering_start_index.take() {
|
||||
Some(Cow::Borrowed(&self.slice[start_index..self.index]))
|
||||
} else {
|
||||
self.raw_buffering_start_index = Some(self.index);
|
||||
None
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
@ -498,6 +542,10 @@ impl<'a> Read<'a> for StrRead<'a> {
|
||||
fn ignore_str(&mut self) -> Result<()> {
|
||||
self.delegate.ignore_str()
|
||||
}
|
||||
|
||||
fn toggle_raw_buffering(&mut self) -> Option<Cow<'a, [u8]>> {
|
||||
self.delegate.toggle_raw_buffering()
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
204
src/ser.rs
204
src/ser.rs
@ -14,14 +14,11 @@ use std::num::FpCategory;
|
||||
use std::str;
|
||||
|
||||
use super::error::{Error, ErrorCode, Result};
|
||||
use serde::ser::{self, Impossible};
|
||||
use serde::ser::{self, Impossible, Serialize};
|
||||
|
||||
use itoa;
|
||||
use ryu;
|
||||
|
||||
#[cfg(feature = "arbitrary_precision")]
|
||||
use serde::Serialize;
|
||||
|
||||
/// A structure for serializing Rust values into JSON.
|
||||
pub struct Serializer<W, F = CompactFormatter> {
|
||||
writer: W,
|
||||
@ -286,10 +283,14 @@ where
|
||||
|
||||
/// Serialize newtypes without an object wrapper.
|
||||
#[inline]
|
||||
fn serialize_newtype_struct<T: ?Sized>(self, _name: &'static str, value: &T) -> Result<()>
|
||||
fn serialize_newtype_struct<T: ?Sized>(self, name: &'static str, value: &T) -> Result<()>
|
||||
where
|
||||
T: ser::Serialize,
|
||||
{
|
||||
if name == ::raw::SERDE_STRUCT_NAME {
|
||||
return value.serialize(RawValueStrEmitter(self));
|
||||
}
|
||||
|
||||
value.serialize(self)
|
||||
}
|
||||
|
||||
@ -1400,6 +1401,189 @@ impl<'a, W: io::Write, F: Formatter> ser::Serializer for NumberStrEmitter<'a, W,
|
||||
}
|
||||
}
|
||||
|
||||
struct RawValueStrEmitter<'a, W: 'a + io::Write, F: 'a + Formatter>(&'a mut Serializer<W, F>);
|
||||
|
||||
impl<'a, W: io::Write, F: Formatter> ser::Serializer for RawValueStrEmitter<'a, W, F> {
|
||||
type Ok = ();
|
||||
type Error = Error;
|
||||
|
||||
type SerializeSeq = Impossible<(), Error>;
|
||||
type SerializeTuple = Impossible<(), Error>;
|
||||
type SerializeTupleStruct = Impossible<(), Error>;
|
||||
type SerializeTupleVariant = Impossible<(), Error>;
|
||||
type SerializeMap = Impossible<(), Error>;
|
||||
type SerializeStruct = Impossible<(), Error>;
|
||||
type SerializeStructVariant = Impossible<(), Error>;
|
||||
|
||||
fn serialize_bool(self, _v: bool) -> Result<Self::Ok> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_i8(self, _v: i8) -> Result<Self::Ok> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_i16(self, _v: i16) -> Result<Self::Ok> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_i32(self, _v: i32) -> Result<Self::Ok> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_i64(self, _v: i64) -> Result<Self::Ok> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
serde_if_integer128! {
|
||||
fn serialize_i128(self, _v: i128) -> Result<Self::Ok> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
}
|
||||
|
||||
fn serialize_u8(self, _v: u8) -> Result<Self::Ok> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_u16(self, _v: u16) -> Result<Self::Ok> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_u32(self, _v: u32) -> Result<Self::Ok> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_u64(self, _v: u64) -> Result<Self::Ok> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
serde_if_integer128! {
|
||||
fn serialize_u128(self, _v: u128) -> Result<Self::Ok> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
}
|
||||
|
||||
fn serialize_f32(self, _v: f32) -> Result<Self::Ok> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_f64(self, _v: f64) -> Result<Self::Ok> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_char(self, _v: char) -> Result<Self::Ok> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_str(self, value: &str) -> Result<Self::Ok> {
|
||||
let RawValueStrEmitter(serializer) = self;
|
||||
serializer
|
||||
.formatter
|
||||
.write_raw_fragment(&mut serializer.writer, value)
|
||||
.map_err(Error::io)
|
||||
}
|
||||
|
||||
fn serialize_bytes(self, _value: &[u8]) -> Result<Self::Ok> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_none(self) -> Result<Self::Ok> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_some<T: ?Sized>(self, _value: &T) -> Result<Self::Ok>
|
||||
where
|
||||
T: Serialize,
|
||||
{
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_unit(self) -> Result<Self::Ok> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_unit_variant(
|
||||
self,
|
||||
_name: &'static str,
|
||||
_variant_index: u32,
|
||||
_variant: &'static str,
|
||||
) -> Result<Self::Ok> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_newtype_struct<T: ?Sized>(
|
||||
self,
|
||||
_name: &'static str,
|
||||
_value: &T,
|
||||
) -> Result<Self::Ok>
|
||||
where
|
||||
T: Serialize,
|
||||
{
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_newtype_variant<T: ?Sized>(
|
||||
self,
|
||||
_name: &'static str,
|
||||
_variant_index: u32,
|
||||
_variant: &'static str,
|
||||
_value: &T,
|
||||
) -> Result<Self::Ok>
|
||||
where
|
||||
T: Serialize,
|
||||
{
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_tuple_struct(
|
||||
self,
|
||||
_name: &'static str,
|
||||
_len: usize,
|
||||
) -> Result<Self::SerializeTupleStruct> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_tuple_variant(
|
||||
self,
|
||||
_name: &'static str,
|
||||
_variant_index: u32,
|
||||
_variant: &'static str,
|
||||
_len: usize,
|
||||
) -> Result<Self::SerializeTupleVariant> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_struct(self, _name: &'static str, _len: usize) -> Result<Self::SerializeStruct> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_struct_variant(
|
||||
self,
|
||||
_name: &'static str,
|
||||
_variant_index: u32,
|
||||
_variant: &'static str,
|
||||
_len: usize,
|
||||
) -> Result<Self::SerializeStructVariant> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
}
|
||||
|
||||
/// Represents a character escape code in a type-safe manner.
|
||||
pub enum CharEscape {
|
||||
/// An escaped quote `"`
|
||||
@ -1743,6 +1927,16 @@ pub trait Formatter {
|
||||
{
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Writes a raw json fragment that doesn't need any escaping to the
|
||||
/// specified writer.
|
||||
#[inline]
|
||||
fn write_raw_fragment<W: ?Sized>(&mut self, writer: &mut W, fragment: &str) -> io::Result<()>
|
||||
where
|
||||
W: io::Write,
|
||||
{
|
||||
writer.write_all(fragment.as_bytes())
|
||||
}
|
||||
}
|
||||
|
||||
/// This structure compacts a JSON value with no extra whitespace.
|
||||
|
@ -300,12 +300,16 @@ impl<'de> serde::Deserializer<'de> for Value {
|
||||
#[inline]
|
||||
fn deserialize_newtype_struct<V>(
|
||||
self,
|
||||
_name: &'static str,
|
||||
name: &'static str,
|
||||
visitor: V,
|
||||
) -> Result<V::Value, Self::Error>
|
||||
where
|
||||
V: Visitor<'de>,
|
||||
{
|
||||
if name == ::raw::SERDE_STRUCT_NAME {
|
||||
return visitor.visit_string(self.to_string());
|
||||
}
|
||||
|
||||
visitor.visit_newtype_struct(self)
|
||||
}
|
||||
|
||||
|
@ -118,6 +118,7 @@ use serde::ser::Serialize;
|
||||
use error::Error;
|
||||
pub use map::Map;
|
||||
pub use number::Number;
|
||||
pub use raw::RawValue;
|
||||
|
||||
pub use self::index::Index;
|
||||
|
||||
|
194
src/value/ser.rs
194
src/value/ser.rs
@ -6,7 +6,7 @@
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
use serde::ser::Impossible;
|
||||
use serde::ser::{self, Impossible};
|
||||
use serde::{self, Serialize};
|
||||
|
||||
use error::{Error, ErrorCode};
|
||||
@ -14,9 +14,6 @@ use map::Map;
|
||||
use number::Number;
|
||||
use value::{to_value, Value};
|
||||
|
||||
#[cfg(feature = "arbitrary_precision")]
|
||||
use serde::ser;
|
||||
|
||||
impl Serialize for Value {
|
||||
#[inline]
|
||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||
@ -150,12 +147,16 @@ impl serde::Serializer for Serializer {
|
||||
#[inline]
|
||||
fn serialize_newtype_struct<T: ?Sized>(
|
||||
self,
|
||||
_name: &'static str,
|
||||
name: &'static str,
|
||||
value: &T,
|
||||
) -> Result<Value, Error>
|
||||
where
|
||||
T: Serialize,
|
||||
{
|
||||
if name == ::raw::SERDE_STRUCT_NAME {
|
||||
return value.serialize(RawValueEmitter);
|
||||
}
|
||||
|
||||
value.serialize(self)
|
||||
}
|
||||
|
||||
@ -812,3 +813,186 @@ impl ser::Serializer for NumberValueEmitter {
|
||||
Err(invalid_number())
|
||||
}
|
||||
}
|
||||
|
||||
struct RawValueEmitter;
|
||||
|
||||
impl ser::Serializer for RawValueEmitter {
|
||||
type Ok = Value;
|
||||
type Error = Error;
|
||||
|
||||
type SerializeSeq = Impossible<Value, Error>;
|
||||
type SerializeTuple = Impossible<Value, Error>;
|
||||
type SerializeTupleStruct = Impossible<Value, Error>;
|
||||
type SerializeTupleVariant = Impossible<Value, Error>;
|
||||
type SerializeMap = Impossible<Value, Error>;
|
||||
type SerializeStruct = Impossible<Value, Error>;
|
||||
type SerializeStructVariant = Impossible<Value, Error>;
|
||||
|
||||
fn serialize_bool(self, _v: bool) -> Result<Self::Ok, Self::Error> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_i8(self, _v: i8) -> Result<Self::Ok, Self::Error> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_i16(self, _v: i16) -> Result<Self::Ok, Self::Error> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_i32(self, _v: i32) -> Result<Self::Ok, Self::Error> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_i64(self, _v: i64) -> Result<Self::Ok, Self::Error> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
serde_if_integer128! {
|
||||
fn serialize_i128(self, _v: i128) -> Result<Self::Ok, Self::Error> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
}
|
||||
|
||||
fn serialize_u8(self, _v: u8) -> Result<Self::Ok, Self::Error> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_u16(self, _v: u16) -> Result<Self::Ok, Self::Error> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_u32(self, _v: u32) -> Result<Self::Ok, Self::Error> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_u64(self, _v: u64) -> Result<Self::Ok, Self::Error> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
serde_if_integer128! {
|
||||
fn serialize_u128(self, _v: u128) -> Result<Self::Ok, Self::Error> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
}
|
||||
|
||||
fn serialize_f32(self, _v: f32) -> Result<Self::Ok, Self::Error> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_f64(self, _v: f64) -> Result<Self::Ok, Self::Error> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_char(self, _v: char) -> Result<Self::Ok, Self::Error> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_str(self, value: &str) -> Result<Self::Ok, Self::Error> {
|
||||
::from_str(value)
|
||||
}
|
||||
|
||||
fn serialize_bytes(self, _value: &[u8]) -> Result<Self::Ok, Self::Error> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_some<T: ?Sized>(self, _value: &T) -> Result<Self::Ok, Self::Error>
|
||||
where
|
||||
T: Serialize,
|
||||
{
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_unit_variant(
|
||||
self,
|
||||
_name: &'static str,
|
||||
_variant_index: u32,
|
||||
_variant: &'static str,
|
||||
) -> Result<Self::Ok, Self::Error> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_newtype_struct<T: ?Sized>(
|
||||
self,
|
||||
_name: &'static str,
|
||||
_value: &T,
|
||||
) -> Result<Self::Ok, Self::Error>
|
||||
where
|
||||
T: Serialize,
|
||||
{
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_newtype_variant<T: ?Sized>(
|
||||
self,
|
||||
_name: &'static str,
|
||||
_variant_index: u32,
|
||||
_variant: &'static str,
|
||||
_value: &T,
|
||||
) -> Result<Self::Ok, Self::Error>
|
||||
where
|
||||
T: Serialize,
|
||||
{
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Self::Error> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_tuple_struct(
|
||||
self,
|
||||
_name: &'static str,
|
||||
_len: usize,
|
||||
) -> Result<Self::SerializeTupleStruct, Self::Error> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_tuple_variant(
|
||||
self,
|
||||
_name: &'static str,
|
||||
_variant_index: u32,
|
||||
_variant: &'static str,
|
||||
_len: usize,
|
||||
) -> Result<Self::SerializeTupleVariant, Self::Error> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_struct(
|
||||
self,
|
||||
_name: &'static str,
|
||||
_len: usize,
|
||||
) -> Result<Self::SerializeStruct, Self::Error> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
|
||||
fn serialize_struct_variant(
|
||||
self,
|
||||
_name: &'static str,
|
||||
_variant_index: u32,
|
||||
_variant: &'static str,
|
||||
_len: usize,
|
||||
) -> Result<Self::SerializeStructVariant, Self::Error> {
|
||||
Err(ser::Error::custom("expected RawValue"))
|
||||
}
|
||||
}
|
||||
|
@ -44,7 +44,7 @@ use serde_bytes::{ByteBuf, Bytes};
|
||||
|
||||
use serde_json::{
|
||||
from_reader, from_slice, from_str, from_value, to_string, to_string_pretty, to_value, to_vec,
|
||||
to_writer, Deserializer, Number, Value,
|
||||
to_writer, Deserializer, Number, RawValue, Value,
|
||||
};
|
||||
|
||||
macro_rules! treemap {
|
||||
@ -2039,3 +2039,52 @@ fn test_integer128() {
|
||||
),
|
||||
]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_raw_value() {
|
||||
#[derive(Serialize, Deserialize)]
|
||||
struct Wrapper<'a> {
|
||||
a: i8,
|
||||
#[serde(borrow)]
|
||||
b: RawValue<'a>,
|
||||
c: i8,
|
||||
};
|
||||
|
||||
let wrapper_from_str =
|
||||
serde_json::from_str::<Wrapper>(r#"{"a": 1, "b": {"foo": 2}, "c": 3}"#).unwrap();
|
||||
assert_eq!(r#"{"foo": 2}"#, wrapper_from_str.b.as_ref());
|
||||
|
||||
let wrapper_from_reader = serde_json::from_reader::<_, Wrapper<'static>>(
|
||||
br#"{"a": 1, "b": {"foo": 2}, "c": 3}"#.as_ref(),
|
||||
).unwrap();
|
||||
assert_eq!(r#"{"foo": 2}"#, wrapper_from_reader.b.as_ref());
|
||||
|
||||
let wrapper_from_value =
|
||||
serde_json::from_value::<Wrapper<'static>>(json!({"a": 1, "b": {"foo": 2}, "c": 3}))
|
||||
.unwrap();
|
||||
assert_eq!(r#"{"foo":2}"#, wrapper_from_value.b.as_ref());
|
||||
|
||||
let wrapper_to_string = serde_json::to_string(&wrapper_from_str).unwrap();
|
||||
assert_eq!(r#"{"a":1,"b":{"foo": 2},"c":3}"#, wrapper_to_string);
|
||||
|
||||
let wrapper_to_value = serde_json::to_value(&wrapper_from_str).unwrap();
|
||||
assert_eq!(json!({"a": 1, "b": {"foo": 2}, "c": 3}), wrapper_to_value);
|
||||
|
||||
let array_from_str =
|
||||
serde_json::from_str::<Vec<RawValue>>(r#"["a", 42, {"foo": "bar"}, null]"#).unwrap();
|
||||
assert_eq!(r#""a""#, array_from_str[0].as_ref());
|
||||
assert_eq!(r#"42"#, array_from_str[1].as_ref());
|
||||
assert_eq!(r#"{"foo": "bar"}"#, array_from_str[2].as_ref());
|
||||
assert_eq!(r#"null"#, array_from_str[3].as_ref());
|
||||
|
||||
let array_from_reader = serde_json::from_reader::<_, Vec<RawValue<'static>>>(
|
||||
br#"["a", 42, {"foo": "bar"}, null]"#.as_ref(),
|
||||
).unwrap();
|
||||
assert_eq!(r#""a""#, array_from_reader[0].as_ref());
|
||||
assert_eq!(r#"42"#, array_from_reader[1].as_ref());
|
||||
assert_eq!(r#"{"foo": "bar"}"#, array_from_reader[2].as_ref());
|
||||
assert_eq!(r#"null"#, array_from_reader[3].as_ref());
|
||||
|
||||
let array_to_string = serde_json::to_string(&array_from_str).unwrap();
|
||||
assert_eq!(r#"["a",42,{"foo": "bar"},null]"#, array_to_string);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user