2013-10-28 3 views
0

DateTextBox 및 TimeTextBox의 입력을 JSON에 직렬화하는 문제가 있습니다. 직렬화 중에 시간대 변환이 이루어 지므로 서버에 시간대를 보내고 적절한 변환을 수행해야합니다.다양한 직렬화 전략을 사용하는 Dojo JSON 직렬화

거기에서 방지하기 위해 직렬화를 위해 날짜 형식을 변경하고 싶습니다. here (나는 이것을 JSFiddle에서 수행했습니다)에서 설명한 것처럼 Date의 프로토 타입을 변경할 수는 있지만 단일 요청의 범위에 대한 동작을 변경하지 않는 것이 좋습니다. 뭐 그런 :

someDojoUtil.jsonSerialize(obj, {option1: 'value1'...}) 

합니까 도장이 그것을 달성하기위한 방법을 제공하거나 유일한 방법은 ALTER 날짜의 프로토 타입을 전역하는 것입니다?

+0

toJSON() 메서드 (링크 된 기사에서 언급 한대로)가 필요를 충족시키지 못합니까? 예를 들어 Form 객체에서 전문화 된 toJSON 직렬화를 해당 형식의 모든 날짜 입력에 연결하십시오. (따라서 양식에 영향을 격리?) – bishop

+0

@ 비숍 나는 REST 채널을 호출하는 방법에 직렬화에 대한 책임을 두어 코드가 속한 장소의 코드를 격리하고 다른 코드를 주장하려고합니다. 응용 프로그램의 일부 (다른 원격 서비스 사용 가능)는 영향을받지 않습니다. –

+0

장기적으로는 * 모든 * 날짜/시간을 UTC의 양방향으로 유선으로 전송하는 것이 좋습니다. Javascript 'Date' 객체로 이미 수행중인 작업이 직렬화되는 것이 아닌가요? – Darien

답변

1

OP의 주석 작성을 기반으로, 나는 Json.stringify에 대한 두 번째 인수, 소위 "replacer"를 사용합니다. 이런 식으로 뭔가 :

require(['dojo/json'], function(Json) { 
    function replacer(key, value) { 
     if ('string' === typeof (value)) { 
      var d = new Date(value); 
      if (isNaN(d.getTime())) { 
       return value; // string, but not a date 
      } 

      // do whatever you want to do, this is just an example 
      d.setSeconds(0); 

      return d.toJSON(); 
     } 
     return value; 
    } 
    var data = {'a':new Date(), 'b':123, 'c':'foo', 'd':[new Date()]}; 
    var str = Json.stringify(data, replacer); 
    console.log(str); 
}); 

난 후, 자신이 동작을 가진 사용자 지정 요청 클래스를 만드는 필요에 따라 그 지정 요청 객체를 사용하여, 도장/요청에 대해 믹스 인으로이 글을 쓰는 것이 좋습니다.

이것은 잘 지내지 만, 나는 그것이 당신의 필요를 충족시킬 것이라고 생각합니다 (나는 그것을 이해하고 있습니다!).

+0

예, 매우 해킹되었습니다. dojo가 객체를 문자열로 바꾸기 전에 객체를 제공했다면 해키하지 않습니다. 어쨌든, 프로토 타입을 변경하는 대안으로 생각할 수있는 해결책입니다. –

+0

@ ŁukaszL : Dojo에 공평하게 대하기 위해 기본 JSON.stringify (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify)로 넘어 가고 있습니다.), 이런 식으로 행동합니다. 전체 개체를 사용할 수 있지만 반복 중에는 사용할 수 없습니다. JSON.stringify ({a : new Date()}, function (k, v) {console.log (v); return v;})'무슨 뜻인지 알기 위해서. 다행이 당신을 위해 일했다! – bishop