2017-02-05 16 views
1

У меня есть JSON объект:Как использовать Serde для (де) сериализации кортежей struct из JSON именованных значений вместо массива?

{ "min": 2, "max": 15 } 

Я хотел бы разобрать его на этом кортеже структуры:

#[derive(Serialize, Deserialize, Debug)] 
struct TeamSize(pub i64, pub i64); 
#[derive(Serialize, Deserialize, Debug)] 
struct Match { 
    size: TeamSize, 
} 

Существующий механизм Serde сериализации, кажется, не обеспечивают функциональные возможности (де) сериализация структуры кортежа из именованных значений вместо массива.

Сформированный (де) механизм сериализации ожидает следующее:

{"size": [2, 15]} 

Я пытался использовать атрибуты Serde, но я не могу найти тот, который делает то, что я хочу:

#[derive(Serialize, Deserialize, Debug)] 
pub struct TeamSize(
    #[serde(rename = "min")] 
    pub i64, 
    #[serde(rename = "max")] 
    pub i64 
); 

Как его разобрать? Должен ли я все реализовать самостоятельно?

Я открыл issue on the Serde repository.

ответ

3
#[derive(Serialize, Deserialize, Debug)] 
pub struct TeamSize(
    #[serde(rename = "min")] 
    pub i64, 
    #[serde(rename = "max")] 
    pub i64 
); 

не правильный код, атрибут Serde rename только переименовывает, что в настоящее время сериализации и десериализации, он не меняет свой код. В структуре tuple (ваш первый) вы можете (и должны) пропустить имена, потому что вы просто получаете к ним доступ через self.0 и self.1, но структура не имеет поля first или second, поэтому вы должны добавить имя им.

Как так:

#[derive(Serialize, Deserialize, Debug)] 
pub struct TeamSize { 
    pub max: i64, 
    pub min: i64, 
}; 

Поскольку название вашего атрибута является имя свойства JSON (как min и max), вам не нужно использовать serde(rename). Вы бы нуждались в этом, если ваша структура Rust использовала поля value_max и value_min, но ваш JSON все еще использовал max и min.

Если вы абсолютно хотите разобрать его на структуру кортежей, вы должны реализовать Serialize и Deserialize для своей собственной структуры самостоятельно. Я не думаю, что это стоит хлопот, но просто переключитесь на структуру вместо структуры tuple.

 Смежные вопросы

  • Нет связанных вопросов^_^