Json은 인터페이스를 속성으로 사용하여 복잡한 개체를 역 직렬화합니다.

LWarthen

.Net 4.6을 사용하여 Web Api 애플리케이션을 구축하고 있습니다. 복잡한 객체 인 JsonConvert.DeserializeObject를 시도하고 있습니다. 이 개체에는 복잡한 개체 목록이 있으며 해당 개체에는 인터페이스가 있습니다. 따라서 Task 클래스에는 TaskDetails 목록이 있고 해당 클래스에는 IBehavior 속성이 있습니다.

public class Task
{
    public int Id { get; set; }
    public int TaskTypeId { get; set; }  //TYPE
    public List<TaskDetail> TaskDetails { get; set; }
}

public class TaskDetail
{
    public int Id { get; set; }
    public IBehavior Behavior { get; set; }
}

그리고 IBehavior는 빈 인터페이스입니다.

public interface  IBehavior
{
}

그리고 구체적인 행동은 ...

public class PartPick : IBehavior
{
    public bool AllowMultiplePicks { get; set; }
    public bool RunLightsOnly { get; set; }
    public bool StandardLightMode { get; set; }

}

또는

public class TorqueTool : IBehavior
{
    public short PSet { get; set; }  
    public short RundownsRequired { get; set; }
    public int MultiSpindleMask { get; set; }
}

JSon 페이로드는 다음과 같습니다.

{
    "id": 10000,
    "name": "Attach Spoiler",
    "taskTypeId": 1,
    "behavior": {
        "pSet": 1,
        "rundownsRequired": 1,
        "multiSpindleMask": 4,
        "multiSpindleMaskString": "0010000000000000"
    }
}

다음과 같은 오류가 발생합니다.

"요청이 유효하지 않습니다.", "modelState": { "task.taskDetails [0] .behavior.pSet": [ "Bl.Models.EPA.IBehavior 유형의 인스턴스를 만들 수 없습니다. 유형은 인터페이스 또는 추상 클래스입니다. 인스턴스화 할 수 없습니다. 경로 'taskDetails [0] .behavior.pSet'

역 직렬화하는 방법이 다음과 같은 JsonBodyModelbinder : IModelBinder를 만들려고했습니다.

private static T DeserializeObjectFromJson(string json)
{
    var binder = new TypeNameSerializationBinder("");

    var obj = JsonConvert.DeserializeObject<T>(json, new JsonSerializerSettings
    {
        TypeNameHandling = TypeNameHandling.Auto,
        Binder = binder
    });
    return obj;
}

httpConfiguration에 연결되어 있습니다.

 config.Services.Insert(typeof(ModelBinderProvider), 0,
            new SimpleModelBinderProvider(typeof(IBehavior), new JsonBodyModelBinder<IBehavior>()));

또한 TaskDetail의 IBehavior 속성에 다음 특성을 추가하려고했습니다.

[JsonConverter(typeof(JsonBodyModelBinder<IBehavior>))]
public IBehavior Behavior { get; set; }
LWarthen

TaskDetail의 속성을 IBehavior에서 dynamic으로 변경할 수 있으며 작동합니다. 그런 다음 콘크리트 유형을 사용해야 할 때 콘크리트 유형 (즉, torqueTool)을 반환 할 수있는 팩토리가 있습니다. 그 시점에서 나는 할 수 있습니다

JsonConvert.DeserializeObject<TorqueTool>(taskDetail.Behavior.ToString());

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

ReadAsAsync <T> ()를 사용하여 복잡한 Json 개체 역 직렬화

분류에서Dev

Json .Net은 플랫 객체를 복잡한 객체로 직렬화합니다 (직렬화 / 역 직렬화에 대한 객체 구조 변경).

분류에서Dev

DynamicJsonArray가있는 복잡한 JSON 개체를 동적으로 역 직렬화

분류에서Dev

NestJS가 복잡한 유형을 사용하여 @Query ()를 DTO로 역 직렬화

분류에서Dev

Json.net은 컴포지션에서 동시 수집으로 복잡한 객체를 역 직렬화합니다.

분류에서Dev

@JsonTypeInfo 및 @JsonSubTypes를 사용하여 JSON을 다형성 개체 모델로 역 직렬화하지 않습니까?

분류에서Dev

Jackson은 Generics를 사용하여 역 직렬화합니다.

분류에서Dev

JSON.NET : 부모 (홀더) 개체 값을 기반으로 인터페이스 속성을 역 직렬화하는 방법은 무엇입니까?

분류에서Dev

복잡한 Swift 객체를 AWS Lambda 페이로드로 올바르게 직렬화 / 역 직렬화하려면 어떻게해야합니까?

분류에서Dev

복잡한 Swift 객체를 AWS Lambda 페이로드로 올바르게 직렬화 / 역 직렬화하려면 어떻게해야합니까?

분류에서Dev

C # Newtonsoft.json을 사용하여 단 하나의 속성 (루트를 찾을 수 없음)에 대한 Json 응답을 역 직렬화합니다.

분류에서Dev

C #에서는 간단한 JSON 개체를 정수 목록으로 역 직렬화합니다.

분류에서Dev

복잡한 JSON 개체 역 직렬화

분류에서Dev

복잡한 자바 객체를 부분적으로 역 직렬화하기

분류에서Dev

GSON을 사용하여 평면화 된 JSON 키를 적절한 개체로 역 직렬화

분류에서Dev

JSON이 날짜를 속성 이름으로 사용하는 경우 GSON을 사용하여 JSON을 Java 개체로 역 직렬화하려면 어떻게해야합니까?

분류에서Dev

Jackson을 사용하여 HTTP Get을 위해 복잡한 Json 객체를 QueryString으로 직렬화하는 방법은 무엇입니까?

분류에서Dev

xsd.exe를 사용한 역 직렬화-DataSet이 아닌 개체로 역 직렬화하는 방법은 무엇입니까?

분류에서Dev

현재 JSON 개체를 역 직렬화 할 수 없습니다. 그룹 열을 사용하여 현재 JSON 개체를 역 직렬화 할 수 없습니다.

분류에서Dev

속성 이름에 $를 사용하여 JSON 역 직렬화

분류에서Dev

Gson 및 Retrofit 2를 사용하여 복잡한 API 응답 역 직렬화

분류에서Dev

JSON.NET은 IDictionary <TKey, TValue>를 사전으로 구현하는 개체를 역 직렬화합니다. 일반 클래스 직렬화를 강제하는 방법은 무엇입니까?

분류에서Dev

동일한 이름의 새 개체로 개체를 역 직렬화하는 방법은 무엇입니까?

분류에서Dev

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

분류에서Dev

속성 이름과 JsonProperty로 JSON을 객체로 역 직렬화합니다.

분류에서Dev

Immutablejs : 복잡한 JS 객체를 역 직렬화하는 방법

분류에서Dev

GSON은 복잡한 객체 배열을 역 직렬화합니다.

분류에서Dev

C #의 중첩 클래스를 사용하여 JSON을 역 직렬화합니다. 개체의 인스턴스를 만들 위치는?

분류에서Dev

중첩 된 개체를 역 직렬화하는 Json.NET은 JsonProperty.Required를 무시합니다.

Related 관련 기사

  1. 1

    ReadAsAsync <T> ()를 사용하여 복잡한 Json 개체 역 직렬화

  2. 2

    Json .Net은 플랫 객체를 복잡한 객체로 직렬화합니다 (직렬화 / 역 직렬화에 대한 객체 구조 변경).

  3. 3

    DynamicJsonArray가있는 복잡한 JSON 개체를 동적으로 역 직렬화

  4. 4

    NestJS가 복잡한 유형을 사용하여 @Query ()를 DTO로 역 직렬화

  5. 5

    Json.net은 컴포지션에서 동시 수집으로 복잡한 객체를 역 직렬화합니다.

  6. 6

    @JsonTypeInfo 및 @JsonSubTypes를 사용하여 JSON을 다형성 개체 모델로 역 직렬화하지 않습니까?

  7. 7

    Jackson은 Generics를 사용하여 역 직렬화합니다.

  8. 8

    JSON.NET : 부모 (홀더) 개체 값을 기반으로 인터페이스 속성을 역 직렬화하는 방법은 무엇입니까?

  9. 9

    복잡한 Swift 객체를 AWS Lambda 페이로드로 올바르게 직렬화 / 역 직렬화하려면 어떻게해야합니까?

  10. 10

    복잡한 Swift 객체를 AWS Lambda 페이로드로 올바르게 직렬화 / 역 직렬화하려면 어떻게해야합니까?

  11. 11

    C # Newtonsoft.json을 사용하여 단 하나의 속성 (루트를 찾을 수 없음)에 대한 Json 응답을 역 직렬화합니다.

  12. 12

    C #에서는 간단한 JSON 개체를 정수 목록으로 역 직렬화합니다.

  13. 13

    복잡한 JSON 개체 역 직렬화

  14. 14

    복잡한 자바 객체를 부분적으로 역 직렬화하기

  15. 15

    GSON을 사용하여 평면화 된 JSON 키를 적절한 개체로 역 직렬화

  16. 16

    JSON이 날짜를 속성 이름으로 사용하는 경우 GSON을 사용하여 JSON을 Java 개체로 역 직렬화하려면 어떻게해야합니까?

  17. 17

    Jackson을 사용하여 HTTP Get을 위해 복잡한 Json 객체를 QueryString으로 직렬화하는 방법은 무엇입니까?

  18. 18

    xsd.exe를 사용한 역 직렬화-DataSet이 아닌 개체로 역 직렬화하는 방법은 무엇입니까?

  19. 19

    현재 JSON 개체를 역 직렬화 할 수 없습니다. 그룹 열을 사용하여 현재 JSON 개체를 역 직렬화 할 수 없습니다.

  20. 20

    속성 이름에 $를 사용하여 JSON 역 직렬화

  21. 21

    Gson 및 Retrofit 2를 사용하여 복잡한 API 응답 역 직렬화

  22. 22

    JSON.NET은 IDictionary <TKey, TValue>를 사전으로 구현하는 개체를 역 직렬화합니다. 일반 클래스 직렬화를 강제하는 방법은 무엇입니까?

  23. 23

    동일한 이름의 새 개체로 개체를 역 직렬화하는 방법은 무엇입니까?

  24. 24

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

  25. 25

    속성 이름과 JsonProperty로 JSON을 객체로 역 직렬화합니다.

  26. 26

    Immutablejs : 복잡한 JS 객체를 역 직렬화하는 방법

  27. 27

    GSON은 복잡한 객체 배열을 역 직렬화합니다.

  28. 28

    C #의 중첩 클래스를 사용하여 JSON을 역 직렬화합니다. 개체의 인스턴스를 만들 위치는?

  29. 29

    중첩 된 개체를 역 직렬화하는 Json.NET은 JsonProperty.Required를 무시합니다.

뜨겁다태그

보관