2012-03-28 2 views
5

기본 유형을 처리 할 때 Json.net의 기본 비 직렬화 동작을 재정의하는 방법이 있습니까? 예를 들어 object[]3.14의 유형에 JSON 배열 [3.14,10,"test"] 역 직렬화 때 형 double 될 것이며 10long 될 것이다. 어쨌든 나는이 타입 결정을 요격하거나 오버라이드 할 수 있기 때문에 값을 각각 decimalint으로 역 직렬화 할 수 있습니까?Json.Net의 기본 기본 유형 처리 재정의

기본적으로 항상 json 정수는 항상 int으로 돌아가고 decimal으로 돌아 오기를 원합니다. 이렇게하면 내 코드에 double ~ decimal 개의 전환을 주입해야하는 번거 로움을 줄일 수 있습니다.

Newtonsoft.Json.Serialization.DefaultContractResolver을 확장하고 내 Newtonsoft.Json.JsonConverter을 구현하는 방법을 살펴 보았지만 원하는 재정의를 구현하는 방법을 찾지 못했습니다.

예제 코드

내가 생각
object[] variousTypes = new object[] {3.14m, 10, "test"}; 
string jsonString = JsonConvert.SerializeObject(variousTypes); 
object[] asObjectArray = JsonConvert.DeserializeObject<object[]>(jsonString); // Contains object {double}, object {long}, object {string} 

답변

1

가이 일을해야 재현하는

public class MyReader : JsonTextReader 
{ 
    public MyReader(string s) : base(new StringReader(s)) 
    { 
    } 

    protected override void SetToken(JsonToken newToken, object value) 
    { 
     object retObj = value; 
     if (retObj is long) retObj = Convert.ChangeType(retObj, typeof(int)); 
     if (retObj is double) retObj = Convert.ChangeType(retObj, typeof(decimal)); 

     base.SetToken(newToken, retObj); 
    } 
} 


object[] variousTypes = new object[] { 3.14m, 10, "test" }; 
string jsonString = JsonConvert.SerializeObject(variousTypes); 

JsonSerializer serializer = new JsonSerializer(); 
var asObjectArray = serializer.Deserialize<object[]>(new MyReader(jsonString)); 
JsonTextReader.SetToken이 json.net 4.5.1 내 릴리스에서 가상으로 표시되지
+0

, 그래서 재정의 '적절한 대체 방법 없음'을 던지고 있습니다. 내가 놓친 게 있니? –

+0

@MatthewRuston 현재 Json.Net 버전은'4.0.5'입니다. –

+0

은 최근 출시 된 버전에서 가상 속성을 삭제 한 것 같습니다. 이상한. –