.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; }
TaskDetail의 속성을 IBehavior에서 dynamic으로 변경할 수 있으며 작동합니다. 그런 다음 콘크리트 유형을 사용해야 할 때 콘크리트 유형 (즉, torqueTool)을 반환 할 수있는 팩토리가 있습니다. 그 시점에서 나는 할 수 있습니다
JsonConvert.DeserializeObject<TorqueTool>(taskDetail.Behavior.ToString());
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다