2016-10-25 4 views
0

각도는 많은 경우에 Date 개의 개체가 필요하지만 JSON에는 날짜의 문자열 표현이 포함되어 있어야합니다.직렬화시 JSON에 유형 정보를 추가하는 방법은 무엇입니까?

나는 날짜 값을 포함하는 속성의 배열을 추가 할 :

class Foo 
{ 
    public int IntProp {get;set;} 
    public DateTime? Prop1 {get;set;} 
    public DateTime Prop2 {get;set;} 
    public Bar Bar {set;set;} 
} 

class Bar 
{ 
    public DateTime Prop {get;set;} 
    public IEnumerable<DateTime?> Dates {get;set;} 
} 

푸 다음과 같이 직렬화한다 :이 날 자동으로 날짜 개체에 문자열을 변환 할 수 있습니다

{ 
    "IntProp": 1, 
    "Prop1": "...", 
    "Prop2": "...", 
    "Bar": { 
     "Prop": "..." 
    }, 

    "<Dates>": [ "Prop1", "Prop2", "Bar.Prop", "Bar.Dates"] 
} 

모든 재산을 테스트하지 않고 클라이언트 측은 Date으로 변환 가능한지 여부는 question에 설명되어 있습니다.

날짜 속성의 경로를 수집 할 수 있지만 채워진 배열을 루트에 추가하는 방법을 모릅니다.

+0

어쩌면 [XY 문제] (HTTPS의 비트 : // meta.stackexchange.com/questions/66377/what-is-the-xy-problem) 여기에 있습니다. Json.NET은 다양한 형식으로 날짜를 표시 할 수 있습니다. [here] (http://www.newtonsoft.com/json/help/html/datesinjson.htm)를 참조하십시오. 'DateTIme' 속성에 대한 JSON을 추가적으로'' ''속성없이 보길 원하십니까? – dbc

+0

@dbc 나는 ​​'날짜'가 선호된다. 하지만 나는 ISO 8601에서 벗어나고 싶지 않다.'Date'를위한 특별한 전용 형식은 없다. 문자열, 숫자, 배열 및 객체를 구별 할 수 있지만 날짜는 문자열로 서식이 지정됩니다. –

답변

1

JObject 중간으로 변환하여 속성을 추가 할 수 있습니다.

public class PathLoggingDateTimeConverter : IsoDateTimeConverter 
{ 
    public const string DatePathPropertyName = "<Dates>"; 

    readonly List<string> paths = new List<string>(); 

    public override bool CanConvert(Type objectType) 
    { 
     if (!base.CanConvert(objectType)) 
      return false; 
     // Not for DateTimeOffset 
     return objectType == typeof(DateTime) || objectType == typeof(DateTime?); 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     base.WriteJson(writer, value, serializer); 
     if (value != null) 
      paths.Add(writer.Path); 
    } 

    public IList<string> Paths { get { return paths; } } 
} 

당신은 할 수 있습니다 : 예를 들어, 다음 변환기를 제공

 var root = new Foo 
     { 
      IntProp = 101, 
      Prop1 = DateTime.Today.ToUniversalTime(), 
      Prop2 = DateTime.Today.ToUniversalTime(), 
      Bar = new Bar 
      { 
       Prop = DateTime.Today.ToUniversalTime(), 
       Dates = new List<DateTime?> { null, DateTime.Today.ToUniversalTime() }, 
      }, 
     }; 

     var converter = new PathLoggingDateTimeConverter(); 
     var settings = new JsonSerializerSettings { Converters = new[] { converter } }; 
     var obj = JObject.FromObject(root, JsonSerializer.CreateDefault(settings)); 
     obj[PathLoggingDateTimeConverter.DatePathPropertyName] = JToken.FromObject(converter.Paths); 

     Console.WriteLine(obj); 

을 그리고 결과는 다음과 같습니다

{ 
    "IntProp": 101, 
    "Prop1": "2016-10-25T04:00:00Z", 
    "Prop2": "2016-10-25T04:00:00Z", 
    "Bar": { 
    "Prop": "2016-10-25T04:00:00Z", 
    "Dates": [ 
     null, 
     "2016-10-25T04:00:00Z" 
    ] 
    }, 
    "<Dates>": [ 
    "Prop1", 
    "Prop2", 
    "Bar.Prop", 
    "Bar.Dates[1]" 
    ] 
} 
+0

그건 내가 정말로 필요한거야. 내일 한번 해봐. 감사. –

관련 문제