2013-08-02 4 views
3

현재 프로젝트에서 ajax를 통해 .jax를 통해 클라이언트 응용 프로그램에 ajax를 통해 보내고 있습니다. 개체 직렬화 및 클라이언트 설정 문제가 있습니다..NET 웹 메서드에서 JSON 날짜 직렬화 수정

정확하게 동일한 개체를 가져 와서 다음 오류가있는 웹 메서드를 통해 다시 게시 할 때 문제가 발생합니다. /Date(1373950800000)/ is not a valid value for DateTime. 이것은 마이크로 소프트가 나에게 준 방식으로 꽤 짜증나지만 그 외에도 포인트.

누구든지 빠른 수정이 가능합니까? 나는 ajax 호출에서 객체를 반환하기 전에 객체를 변경하지 않고도이 작업을 완벽하게 수행 할 수 있기를 원합니다. 이 하나가 오류와 함께 당신을 도울 것입니다

+3

서버 측에서 사용중인 serializer는 무엇입니까? –

+0

'/ Date (1373950800000) /'문자열을 서버에서 가져 옵니까? 아니면 '1373950800000'입니까? –

+1

검색을 수행 한이 게시물을 찾았습니다 http://stackoverflow.com/questions/6928281/convert-serialized-c-sharp-datetime-to-js-date-object 잘하면이 도움이 될 것입니다 :) –

답변

7

에있는 .NET 날짜가 가까운 나노초에 있습니다 귀하의 문제는 사용중인 서버 측 JavaScript 직렬 포트에 발생합니다. JsonDataContractSerializer (ASP.NET MVC의 기본 serializer) 또는 NewtonSoft Json Serializer (ASP.NET 웹 API의 기본 serializer).

이 날짜 변경 문제의 가능한 예와 가능한 해결 방법은 JSON Dates are Different in ASP.NET MVC and Web API입니다.

+0

ASP.NET webforms 4.0을 사용하고 있습니다. 프로젝트의 요구 사항. – Justin

0

: click me

var yourDateTimeObject = ... 
var converter = new IsoDateTimeConverter(); 

string isoDateTime = Newtonsoft.Json.JsonConvert.SerializeObject(yourDateTimeObject, converter); 
+1

이 문제는 .NET에서 처리하는 대신 수동으로 serialize하는 문제입니다..NET에서 동일한 'DateTime'유형을 유지하고 싶다면 내 속임수를 사용하지 않아도됩니다. – Justin

0

이것은 내가이 일을 위해 사용하는 방법입니다 :

먼저 당신이 날짜 매개 변수 밖으로 쓰레기를 청소해야

String unixDate = "/Date(1373950800000)/"; 
unixDate = unixDate.Replace("/Date(","").Replace(")/", ""); 

이제 .NET과 유닉스는 다른 방식으로 시간을 측정하므로 1970 년 1 월 1 일로 설정된 날짜를 만든 다음이를 당신이

DateTime dotNetDate = new DateTime(1970, 1, 1); 
dotNetDate = dotNetDate.AddMilliseconds(Convert.ToInt64(unixDate) 

또한주의해야한다 전달 된 날짜의 숫자 부분이있을 것입니다 여기 정밀도의 손실 - 유닉스 날짜가 가까운 밀리 초

+0

이 솔루션은 날짜 검색 (읽기 :'GET' 요청)에만 작동하며, 날짜를 설정 (읽기 :'POST' 요청)하려고하면 직렬 장치가 사용되기 때문에 동일한 문제가 발생합니다 서버 쪽에서 날짜를 mangle 것입니다. –

+0

@ KarlAnderson - 날짜가 게시물을 어떻게 보는지 예를 들어 자세히 설명해 주시겠습니까? 나는 이걸 찾아 오지 않았다. – CurlyPaul

+0

CurlyPaul - POST 이후 날짜가 어떻게 보이는지는 잘 모르겠지만, 시리얼 라이저가 값을 .NET 날짜로 다시 변환하려고 시도 할 때 문제가 발생한다. 그것은 엉망이 될 것입니다. 내 대답의 링크를 참조하십시오. –

0

슬래시를 이스케이프 처리하여 날짜를 보내보십시오. 나는 아이 패드 클라이언트가 있다는 ASP.NET WebAPI 서비스 방법에 게시물 JSON 우리는 날짜 이런 식으로 보내야합니다 : 직렬화 다음 코드로 문제를 해결할 수있는 동안

"due": "\/Date(1335830400000)\/"

+0

나는 클라이언트가 그것을 얻은 직후 서버에서 바로 오는 직렬화 된 정보를 변경하도록 강요하지 않는다 ... 편집 : 나는 시도하고 동일한 오류가 발생했습니다. – Justin

+0

내가 본 것부터 서버는 이스케이프 된 슬래시가있는 날짜도 보냅니다. 피들러 (Fiddler)를 사용하여 내 서비스 메소드를 호출하면 날짜는' "\/Date (1334938675734) \ /"'로 표시됩니다. –

+0

Javascript가 자동으로 백 슬래시를 제거하지만 '\/Date (1334938675734) \ /'의 문자열 리터럴을 강제로 사용했지만 여전히 같은 오류로 실패했습니다. – Justin

5

DateFormat의 핸들을

JsonConvert.SerializeObject(yourobject, Formatting.Indented, 
        new JsonSerializerSettings 
        { 
         DateFormatHandling = DateFormatHandling.IsoDateFormat 
        }); 

2009-02-15T00 : 00 : 00Z 형식의 날짜가 표시됩니다.

+0

JsonConvert는 .NET Json이 아닌 NewtonSoft.Json이므로 NuGet (또는 다른 방법)을 사용하여 설치해야합니다. 자세한 내용은 링크 및 관련 질문을 참조하십시오. –

관련 문제