다양한 유형의 객체를 포함하는 JSON 배열 역 직렬화

주린 니콜라스

그래서 다음과 같은 JSON이 있습니다.

{
  "name": "customer",
  "properties": [
    {
      "name": "id",
      "type": "int",
      "value": 32
    },
    {
      "name": "name",
      "type": "string",
      "value": "John"
    }
  ]
}

현재 나는이 구조체 세트로 deserialize하고 있습니다.

#[derive(Serialize, Deserialize, Debug)]
struct Customer {
    name: String,
    properties: Vec<Property>,
}

#[derive(Serialize, Deserialize, Debug)]
#[serde(tag = "name", content = "value")]
enum Property {
    #[serde(rename = "id")]
    Id(i32),
    #[serde(rename = "name")]
    Name(String),
}

그러나 속성에 액세스 할 때마다 열거 형을 통한 일치를 처리하지 않으려면 다음과 같은 구조체로 역 직렬화하고 싶습니다.

struct Customer {
  name: String,
  properties: Properties,
}

struct Properties {
  id: i32, // will be 32 as in the object containing the name "id".
  name: String, // will be John as in the object containing the name "name".
}

이것이 serde도서관이 어떤 식 으로든 허용하는 것입니까? 그렇다면 그것을 달성하는 방법에 대한 예를 제공 할 수 있습니까?

실제 json 구조를 엉망으로 만들 수 없으므로 필요한 솔루션에 관심이 없습니다.

주린 니콜라스

edkeveked의 답변 덕분 에 내 요구 사항에 맞는 솔루션을 찾을 수있었습니다.

기본적으로 Deserializer를 재정렬하여 전체 속성 배열을 반복하고 그 안의 모든 개체를 Enum 변형과 일치 시키려고했습니다. 나는 미래에 새 속성을 쉽게 매핑 할 수 있고 유형별로 더 유연하게 느껴지기 때문에 이것을 좋아합니다.

어쨌든, 여기에 대한 코드가 있습니다.

extern crate serde;
extern crate serde_json;
#[macro_use]
extern crate serde_derive;

use serde::de::{Deserializer, SeqAccess, Visitor};
use std::fmt;

#[derive(Serialize, Deserialize, Debug)]
struct Customer {
    name: String,
    #[serde(deserialize_with = "parse_property")]
    properties: CustomerProps,
}

#[derive(Default, Serialize, Deserialize, Debug)]
struct CustomerProps {
    id: i32,
    name: String,
}

#[derive(Serialize, Deserialize, Debug)]
#[serde(tag = "name", content = "value")]
enum Property {
    #[serde(rename = "id")]
    Id(i32),
    #[serde(rename = "name")]
    Name(String),
}

fn parse_property<'de, D>(deserializer: D) -> Result<CustomerProps, D::Error>
where
    D: Deserializer<'de>,
{
    struct PropertyParser;
    impl<'de> Visitor<'de> for PropertyParser {
        type Value = CustomerProps;

        fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
            formatter.write_str("[u64, f32, usize]")
        }

        fn visit_seq<A: SeqAccess<'de>>(self, mut seq: A) -> Result<Self::Value, A::Error> {
            let mut prop = CustomerProps {
                ..Default::default()
            };
            while let Some(tmp) = seq.next_element::<Property>()? {
                match tmp {
                    Property::Id(id) => prop.id = id,
                    Property::Name(name) => prop.name = name,
                }
            }
            Ok(prop)
        }
    }
    deserializer.deserialize_any(PropertyParser {})
}

fn main() {
    let data = r#"{
        "name": "customer",
        "properties": [
            {
                "name": "id",
                "type": "int",
                "value": 32
            },
            {
                "name": "name",
                "type": "string",
                "value": "John"
            }
        ]
    }"#;

    let p: Customer = serde_json::from_str(data).unwrap();

    println!("Please call {} at the number {} {}", p.name, p.properties.id, p.properties.name);
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

다양한 데이터 유형을 포함하는 JSON 배열을 단일 객체로 역 직렬화하는 방법

분류에서Dev

GSON을 사용하여 객체의 JSON 배열 역 직렬화

분류에서Dev

JSON Newtonsoft C # 다양한 유형의 객체 목록 역 직렬화

분류에서Dev

배열 또는 중첩 배열을 포함 할 수있는 JSon의 객체로 Json.net 역 직렬화

분류에서Dev

직렬화 가능한 객체의 배열로 클래스를 역 직렬화하는 방법

분류에서Dev

다른 개체를 포함하는 json 개체 역 직렬화

분류에서Dev

Jackson ObjectMapper는 배열로 객체를 역 직렬화합니다.

분류에서Dev

공백을 포함하는 열거 형을 사용하여 Json을 NJsonSchema 생성 객체로 역 직렬화

분류에서Dev

JSON 데이터를 모델 객체의 배열로 역 직렬화하는 방법은 무엇입니까?

분류에서Dev

객체 유형을 유추 / 포함하여 Java에서 JSON 역 직렬화

분류에서Dev

json newtonsoft : 문자열 목록을 포함하는 객체 역 직렬화

분류에서Dev

객체를 포함하여 여러 유형을 포함하는 역 직렬화 된 목록의 JSON.net 액세스 값

분류에서Dev

배열의 JSON 배열 역 직렬화

분류에서Dev

DynamicJson은 "비 개체"유형의 배열을 올바르게 역 직렬화하지 않습니다.

분류에서Dev

JSON.parse ()가 JSON 문자열을 포함하는 배열의 마지막 인덱스를 역 직렬화하지 못함

분류에서Dev

@@를 포함하는 json 문자열을 scala로 역 직렬화하는 방법 '

분류에서Dev

JSON 문자열을 객체로 역 직렬화하는 방법

분류에서Dev

현재 JSON 배열 (예 : [1,2,3])을 복잡하고 중첩 된 개체가있는 유형으로 역 직렬화 할 수 없습니다.

분류에서Dev

System.Text.Json을 사용하여 배열 json 개체의 중첩 된 배열을 역 직렬화

분류에서Dev

유형이있는 JSON.NET을 통해 들쭉날쭉 한 배열 역 직렬화

분류에서Dev

복잡한 Json 객체 역 직렬화

분류에서Dev

JavaScriptSerializer로 JSON 문자열을 역 직렬화하여 키 및 값 배열 대신 단일 동적 객체를 반환합니다.

분류에서Dev

jackson을 사용하여 동일한 ID를 가진 2 개의 개체를 포함하는 Json을 역 직렬화 할 수 없습니다.

분류에서Dev

중첩 된 객체의 필드 중 하나를 기반으로 중첩 된 JSON 객체를 기본 유형으로 역 직렬화하는 방법

분류에서Dev

현재 JSON 개체 (예 : { "name": "value"})를 형식으로 역 직렬화 할 수 없습니다. 올바르게 역 직렬화하려면 JSON 배열 (예 : [1,2,3])이 필요합니다.

분류에서Dev

역 직렬화 할 수없는 일부 개체를 포함하는 배열 역 직렬화 (역 직렬화 가능 부분 구하기)

분류에서Dev

MemoryStream에서 다양한 객체 유형을 효율적으로 역 직렬화

분류에서Dev

C #에서 3 개의 하위 개체를 포함하는 JSON 개체 역 직렬화

분류에서Dev

배열 JSON 역 직렬화

Related 관련 기사

  1. 1

    다양한 데이터 유형을 포함하는 JSON 배열을 단일 객체로 역 직렬화하는 방법

  2. 2

    GSON을 사용하여 객체의 JSON 배열 역 직렬화

  3. 3

    JSON Newtonsoft C # 다양한 유형의 객체 목록 역 직렬화

  4. 4

    배열 또는 중첩 배열을 포함 할 수있는 JSon의 객체로 Json.net 역 직렬화

  5. 5

    직렬화 가능한 객체의 배열로 클래스를 역 직렬화하는 방법

  6. 6

    다른 개체를 포함하는 json 개체 역 직렬화

  7. 7

    Jackson ObjectMapper는 배열로 객체를 역 직렬화합니다.

  8. 8

    공백을 포함하는 열거 형을 사용하여 Json을 NJsonSchema 생성 객체로 역 직렬화

  9. 9

    JSON 데이터를 모델 객체의 배열로 역 직렬화하는 방법은 무엇입니까?

  10. 10

    객체 유형을 유추 / 포함하여 Java에서 JSON 역 직렬화

  11. 11

    json newtonsoft : 문자열 목록을 포함하는 객체 역 직렬화

  12. 12

    객체를 포함하여 여러 유형을 포함하는 역 직렬화 된 목록의 JSON.net 액세스 값

  13. 13

    배열의 JSON 배열 역 직렬화

  14. 14

    DynamicJson은 "비 개체"유형의 배열을 올바르게 역 직렬화하지 않습니다.

  15. 15

    JSON.parse ()가 JSON 문자열을 포함하는 배열의 마지막 인덱스를 역 직렬화하지 못함

  16. 16

    @@를 포함하는 json 문자열을 scala로 역 직렬화하는 방법 '

  17. 17

    JSON 문자열을 객체로 역 직렬화하는 방법

  18. 18

    현재 JSON 배열 (예 : [1,2,3])을 복잡하고 중첩 된 개체가있는 유형으로 역 직렬화 할 수 없습니다.

  19. 19

    System.Text.Json을 사용하여 배열 json 개체의 중첩 된 배열을 역 직렬화

  20. 20

    유형이있는 JSON.NET을 통해 들쭉날쭉 한 배열 역 직렬화

  21. 21

    복잡한 Json 객체 역 직렬화

  22. 22

    JavaScriptSerializer로 JSON 문자열을 역 직렬화하여 키 및 값 배열 대신 단일 동적 객체를 반환합니다.

  23. 23

    jackson을 사용하여 동일한 ID를 가진 2 개의 개체를 포함하는 Json을 역 직렬화 할 수 없습니다.

  24. 24

    중첩 된 객체의 필드 중 하나를 기반으로 중첩 된 JSON 객체를 기본 유형으로 역 직렬화하는 방법

  25. 25

    현재 JSON 개체 (예 : { "name": "value"})를 형식으로 역 직렬화 할 수 없습니다. 올바르게 역 직렬화하려면 JSON 배열 (예 : [1,2,3])이 필요합니다.

  26. 26

    역 직렬화 할 수없는 일부 개체를 포함하는 배열 역 직렬화 (역 직렬화 가능 부분 구하기)

  27. 27

    MemoryStream에서 다양한 객체 유형을 효율적으로 역 직렬화

  28. 28

    C #에서 3 개의 하위 개체를 포함하는 JSON 개체 역 직렬화

  29. 29

    배열 JSON 역 직렬화

뜨겁다태그

보관