2017-03-27 1 views
2

내가 JSON으로 양식 데이터를 직렬화하고 데이터베이스에 저장 :Asp.Net Core : json에서 IFormCollection을 serialize하고 deserialize하는 방법은 무엇입니까? 컨트롤러에서

public IActionResult Edit(int id) 
{ 
    var doc = _context.Docs 
     .Where(o => o.Id == id).FirstOrDefault(); 

    if (doc == null) 
    { 
     ViewData["ErrorMessage"] = "Not found"; 
     return View("Error"); 
    } 

    var formData = JsonConvert.DeserializeObject<IFormCollection>(doc.Content); 
    ViewData["FormData"] = formData; 

    return View(doc); 
} 

것은 위의가 발생합니다 :

[HttpPost] 
[ValidateAntiForgeryToken] 
public IActionResult Create(IFormCollection formData) 
{ 
    var json = JsonConvert.SerializeObject(formData); 
    var doc = new Doc() 
    { 
     Subject = formData["subject"], 
     Content = json 
    }; 

    _context.Docs.Add(doc); 
    _context.SaveChanges(); 

    return RedirectToAction("Edit", new { Id = doc.Id }); 
} 

지금, 나는 양식을 양식 데이터를 직렬화하고 재구성하고 싶습니다 deserialization의 예외 :

JsonSerializationException : 목록 형식 Microsoft.AspNetCore.Http.IFormCollection을 만들고 채울 수 없습니다. 경로 ', 1 줄, 위치 1.

형식을 지정하지 않으면 deserialization이 성공합니다. 하지만 을 IFormCollection으로 deserialize하는 것이 더 좋습니다. IFormCollection을 deserialize하는 적절한 방법은 무엇입니까?

또한 json을 저장하는 이유는 30 가지 유형의 양식을 처리하기 때문에 각 개체에 대해 강력한 형식의 모델 개체를 만들고 싶지 않기 때문입니다. 어떤 조언을 환영합니다.

+0

구체적인 유형을 알지 못하면서 컴파일러가 인터페이스에 비 직렬화를 어떻게 기대합니까? 인터페이스에는 구현이 없으며 인터페이스는'new' 키워드로 인스턴스화 될 수 없습니다. 당신은 ** concrete ** 타입을 제공해야하거나 타입 내에서 serialize 할 때 (당신은 json 안에 _type (또는 그렇게) 속성을 가질 것입니다), 타입을 버리고 인터페이스로 다시 던지십시오 :'(IFormCollection) JsonConvert.DeserializeObject (doc.Content)' – Tseng

답변

1

나는 데이터베이스에서 JSON 개체를 처리하는 데 사용되는 방법 :

public class Contact 
{ 
    public int Id { get; set; } 
    internal string _Data { get; set; } 

    [NotMapped] 
    public UserData Data 
    { 
     get { return _Data == null ? null : JsonConvert.DeserializeObject<UserData>(_Data); } 
     set { _Data = JsonConvert.SerializeObject(value); } 
    } 
} 

public class UserData 
{ 
    public string Name { get; set; } 

    //Add your json data here 
} 

그리고

처럼 내 컨트롤러의 모양을

당신의 엔티티 객체에서

이 JSON 객체로 매핑을 처리하는 다른 클래스를 추가

public IActionResult Add(AddContactViewModel model) 
{ 
     var contact = new Contact() 
     { 
      Data = JsonConvert.DeserializeObject<UserData>(model.Data.ToString()) 
     }; 
     _contactService.Add(contact); 
     return new OkObjectResult(contact); 
} 

public class AddContactViewModel 
{ 
    public JObject Data { get; set; } 
} 

감사합니다. 개체 접촉에 포함 된 개체 데이터에 액세스하면 이전에 UserData 개체에 정의 된 모든 데이터에 액세스 할 수 있습니다 (Obje ct 이름은 귀하의 경우에 변경 될 수 있습니다)

var contact = new Contact() 
{ 
    Data = JsonConvert.DeserializeObject<UserData>(model.Data.ToString()) 
}; 

contact.Data.Name; 
+0

ASP.NET Core는 내부적으로 어떻게 직렬화합니까? – Shimmy

관련 문제