JSON을 개체로 역 직렬화 할 때 발생하는 .NET Web API 문제

Jürgen Zornig

회사에서 우리를 위해 개발 한 프로젝트를 따라 잡았지만, 안타깝게도 많은 지원을받지 못하고 장기적으로는 스스로 유지 보수를해야합니다. 애플리케이션은 간단한 웹 클라이언트 (HTTP, JavaScript, Knockout Framework)와 REST API 서비스 (.NET 4.5, ASP.NET MVC)로 구성됩니다.

현재 저는 클라이언트 만 수정하고 있으므로 서버는 여전히 예상대로 작동합니다.

클라이언트 측에서 나는 Knockout View Model을 약간 수정했습니다 (일부 계산 가능하고 일부 값의 최적화 된 표현을 추가했습니다). View Model은 'Issues'와 'Comments'로 구성됩니다 (사실상 버그 추적기 인 이슈 배열). 새 이슈를 생성하면 첫 번째 댓글에 설명이 추가되고 전체 모델은 JSON.stringified이며 .NET API 서비스로 전송됩니다. Firebug를 통해 게시되는 JSON은 다음과 같습니다.

{
   "Id":0,
   "Title":"THis is a title",
   "Comments":[
       {
          "Id":1,
          "Text":"this is the first comment"
       }
   ]
}

클라이언트 측에는 "IssueController"가 있습니다.

[HttpPost]
public HttpResponseMessage PostIssues( Issue issue ) {
   //issue should already hold the deserialized content of the JSON here,
   //but it only contains 'Id' and 'Title' not the 'Comments' (empty List)
   ...
}

이슈 도메인 모델 객체는 또한 주석을 보관하기위한 배열을 가지고 있지만,이 부분에서는 이미 비어 있습니다. .NET 코드에는 JSON을 명시 적으로 구문 분석하는 부분이 없습니다. 내가 이해하는 한 MVC 프레임 워크는 동일한 속성 이름으로이를 암시 적으로 수행합니다 (맞습니까?).

역 직렬화는 이미 예상대로 작동 했으므로 .NET 코드는 괜찮을 것입니다.하지만이 암시 적 주석 매핑이 더 이상 작동하지 않는 방식으로 JSON을 수정 한 것 같습니다. 불행히도 저는 .NET MVC 프레임 워크에 대한 경험이 많지 않습니다 (또는 .NET WebAPI 프레임 워크 일 뿐이며 그 사실을 말할 수도 없습니다).

내 질문은 다음과 같습니다.

  1. 어떤 종류의 .NET REST API 프레임 워크입니까? 어떻게 구별 할 수 있습니까?
  2. 이 암시 적 JSON 역 직렬화는 어떻게 작동하며, 예를 들어 JSON의 일부가 예상대로 역 직렬화되지 않는 경우의 함정은 무엇입니까? 특히 클라이언트 측에서 (말했듯이 서버 코드를 수정하지 않았습니다)
  3. 서버가 더 이상 좋아하지 않는다는 JSON에 대한 아이디어가 있습니까? ;)

편집하다

Issue.cs는 다음과 같습니다 (확실히 단순화 됨).

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Bo;
using Projects.DomainObjects;

namespace Projects.Models {


public class Issue : DomainObject {

    public Issue() {

        this.Comments = new List<Comment>();
    }

    public long Id { get; set; }

    private string _Title;
    public string Title { get { return _Title; } set { _Title = value; NotifyChanged(); } }

    public List<Comment> Comments { get; set; }
}

Comment.cs :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Common;
using Projects.DomainObjects;

namespace Projects.Models {


public class Comment : DomainObject {

    public Comment() {

    }

    public long Id { get; set; }
    public string Text { get; set; }
}
Jürgen Zornig

해결 된 문제는 정렬 된 주석 배열을 반환하는 계산이었습니다. 그래서 내 녹아웃 모델에는

self.Comments = ko.observableArray([]); //...which gets filled with the comments of an issue

그리고

self.CommentsSorted = ko.computed(function() {...}); //...which simply returns a sorted Comments array

따라서이 모델을 직렬화 할 때 게시 된 JSON은 이제 CommentsArray와 Array를 나타냅니다 CommentsSorted. 내가 할 때만

var i = ko.toJS(issue);
delete i.CommentsSorted;

i데이터로 게시하기 전에 .NET은 Comments올바르게 역 직렬화 할 수 있습니다.

이것에 대한 신비한 점은 .NET에서 완전히 무시되고 어떤 식 으로든 역 직렬화를 방해하지 않는 녹아웃 모델에 항상 다른 계산 된 필드가 있다는 것입니다. 따라서 주로 모델의 필드 이름과 유형에 따라 달라지는 것 같습니다 (아마도 첫 글자가 동일한 경우).

좋은 점 : 지금 작동합니다. 나쁜 점 : .NET이 JSON 데이터의 역 직렬화를 수행하는 방식이 실제로 결정적이지 않으며 예상대로 작동하지 않는 경우 디버깅 할 수도 없습니다.

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

JSON 문자열을 C # 개체로 역 직렬화 할 때 빈 클래스

분류에서Dev

ASP.NET Web API-JSON을 역 직렬화하는 방법

분류에서Dev

Json.Net을 사용하여 DataSet으로 역 직렬화 할 때 ArgumentOutOfRange 예외

분류에서Dev

Web API 및 JSON.NET을 사용하여 객체를 직렬화 할 때 $ id / $ ref 방지

분류에서Dev

PropertyName을 속성 유형으로 직렬화 할 때 발생하는 문제

분류에서Dev

json 문자열을 .NET 개체 목록으로 역 직렬화

분류에서Dev

json 문자열을 개체 C # .net으로 역 직렬화

분류에서Dev

파일에서 개체를 역 직렬화 및 재 직렬화하는 데 문제가있는 C # JSON.net

분류에서Dev

GSON을 사용하여 JSON 문자열을 역 직렬화하려고 할 때 오류 발생

분류에서Dev

JSON을 C # 개체로 역 직렬화하는 데 문제가 있습니다.

분류에서Dev

C #에서 JSON 파일을 역 직렬화 할 때 StackOverflowException 발생

분류에서Dev

xml 파일을 역 직렬화 할 때 발생하는 문제를 해결하는 방법은 무엇입니까?

분류에서Dev

Web API에서 클래스로 JSON을 역 직렬화하는 방법

분류에서Dev

Json.Net 역 직렬화로 인해 null 개체가 발생합니다.

분류에서Dev

JSON을 .net 객체로 역 직렬화

분류에서Dev

강력한 형식의 개체로 JSON 응답을 직접 역 직렬화 할 때 필드를 피하는 방법은 무엇입니까?

분류에서Dev

ASP.Net Core MVC로 마이그레이션 할 때 JSON 직렬화 / 역 직렬화가 작동하지 않음

분류에서Dev

json.net이 개체 목록으로 역 직렬화 할 수 없음

분류에서Dev

목록을 포함하는 개체로 XML 문자열을 역 직렬화 할 수 없습니다.

분류에서Dev

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

분류에서Dev

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

분류에서Dev

Web API는 Javascript Date.toISOString ()을 역 직렬화 할 수 없습니까?

분류에서Dev

Json.Net으로 역 직렬화 할 때 런타임에 System.Type을 <T>로 사용

분류에서Dev

예측할 수없는 JSON 속성을 문자열로 역 직렬화

분류에서Dev

Json 개체를 .NET 개체로 역 직렬화

분류에서Dev

PowerShell-.NET 개체에서 역 직렬화 할 때 키 값 쌍 열거

분류에서Dev

JSON 배열을 C # 개체로 역 직렬화 (TFL API)

분류에서Dev

Rest Service에서이 json 객체를 역 직렬화 할 때이 캐스팅 오류가 발생하는 이유는 무엇입니까?

분류에서Dev

Jackson 2 주석에서 역 직렬화 할 때 JSON에서 래퍼 객체를 생략하는 방법

Related 관련 기사

  1. 1

    JSON 문자열을 C # 개체로 역 직렬화 할 때 빈 클래스

  2. 2

    ASP.NET Web API-JSON을 역 직렬화하는 방법

  3. 3

    Json.Net을 사용하여 DataSet으로 역 직렬화 할 때 ArgumentOutOfRange 예외

  4. 4

    Web API 및 JSON.NET을 사용하여 객체를 직렬화 할 때 $ id / $ ref 방지

  5. 5

    PropertyName을 속성 유형으로 직렬화 할 때 발생하는 문제

  6. 6

    json 문자열을 .NET 개체 목록으로 역 직렬화

  7. 7

    json 문자열을 개체 C # .net으로 역 직렬화

  8. 8

    파일에서 개체를 역 직렬화 및 재 직렬화하는 데 문제가있는 C # JSON.net

  9. 9

    GSON을 사용하여 JSON 문자열을 역 직렬화하려고 할 때 오류 발생

  10. 10

    JSON을 C # 개체로 역 직렬화하는 데 문제가 있습니다.

  11. 11

    C #에서 JSON 파일을 역 직렬화 할 때 StackOverflowException 발생

  12. 12

    xml 파일을 역 직렬화 할 때 발생하는 문제를 해결하는 방법은 무엇입니까?

  13. 13

    Web API에서 클래스로 JSON을 역 직렬화하는 방법

  14. 14

    Json.Net 역 직렬화로 인해 null 개체가 발생합니다.

  15. 15

    JSON을 .net 객체로 역 직렬화

  16. 16

    강력한 형식의 개체로 JSON 응답을 직접 역 직렬화 할 때 필드를 피하는 방법은 무엇입니까?

  17. 17

    ASP.Net Core MVC로 마이그레이션 할 때 JSON 직렬화 / 역 직렬화가 작동하지 않음

  18. 18

    json.net이 개체 목록으로 역 직렬화 할 수 없음

  19. 19

    목록을 포함하는 개체로 XML 문자열을 역 직렬화 할 수 없습니다.

  20. 20

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

  21. 21

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

  22. 22

    Web API는 Javascript Date.toISOString ()을 역 직렬화 할 수 없습니까?

  23. 23

    Json.Net으로 역 직렬화 할 때 런타임에 System.Type을 <T>로 사용

  24. 24

    예측할 수없는 JSON 속성을 문자열로 역 직렬화

  25. 25

    Json 개체를 .NET 개체로 역 직렬화

  26. 26

    PowerShell-.NET 개체에서 역 직렬화 할 때 키 값 쌍 열거

  27. 27

    JSON 배열을 C # 개체로 역 직렬화 (TFL API)

  28. 28

    Rest Service에서이 json 객체를 역 직렬화 할 때이 캐스팅 오류가 발생하는 이유는 무엇입니까?

  29. 29

    Jackson 2 주석에서 역 직렬화 할 때 JSON에서 래퍼 객체를 생략하는 방법

뜨겁다태그

보관