2017-04-18 2 views
1

JSON.NET은 deserializing hexadecimal numbers (예 : 0xffff)을 지원하지만은 입니다.JSON.NET에서 정수를 16 진수로 serialize

다음 작품,하지만 너무 복잡한 것 같다

가 난 단지 정수에 대해, DateFormatHandling의 라인을 따라 뭔가를 찾고 있어요.

+1

장면 변환은'JsonTextWriter'와 비교됩니다. JSON 형식은 16 진수를 지원하지 않으므로 문자열에 값을 넣을 것입니다. 당신이 가진 것은 다르게 작동합니다. – Romoku

+2

그게 내가 아는 가장 쉬운 방법이야. 다른 옵션은'JsonTextWriter'를 서브 클래스 화하고 ['JsonTextWriter.WriteValue (Int32)'] (http://www.newtonsoft.com/json/help/html/M_Newtonsoft_Json_JsonTextWriter_WriteValue_10.htm)와 같은 메소드를 오버 라이딩하는 것입니다. 16 진수 형식 번호는 명시 적으로 [JSON 표준] (http://www.json.org/)에 위배됩니다 (공식 JSON 표현이없는 날짜와는 다릅니다 (http://www.newtonsoft.com/json/help/ html/datesinjson.htm)) 16 진수 형식 출력이 내장되어 있지 않을 수 있습니다. – dbc

답변

2

주석에서 지적했듯이 16 진수 리터럴은 JSON에서 허용되지 않습니다 (JavaScript와 반대). 변환기

문자열 리터럴 및 부사장을 16 진수에 uint 값을 변환 반대 :

public sealed class HexStringJsonConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return typeof(uint).Equals(objectType); 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     writer.WriteValue($"0x{value:x}"); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     var str = reader.ReadAsString(); 
     if (str == null || !str.StartsWith("0x")) 
      throw new JsonSerializationException(); 
     return Convert.ToUInt32(str); 
    } 
} 

사용 예 Newtonsoft.Json의`JsonTextReader`는 더 많은 behind-을 처리

public sealed class CanonInfo 
{ 
    [JsonConverter(typeof(HexStringJsonConverter))] 
    public uint ModelId { get; set; } 

    [JsonConverter(typeof(HexStringJsonConverter))] 
    public uint FirmwareRevision { get; set; } 
}