2017-10-11 5 views
0

이 코드는 잘 작동 :JSON (snake_case)에서 동적 (PascalCase)으로 비 직렬화하는 방법은 무엇입니까?

string json = @"{""MyProperty"" : ""bar""}"; 

var payload = JsonConvert.DeserializeObject<dynamic>(json); 

string typedProperty = payload.MyProperty; //contains "bar" 

이의이 snake_case의 JSON과 동일한 작업을 수행 해보자. 실제로 recommended waySnakeCaseNamingStrategy을 추가하여 snake_case를 처리합니다.

_snakeSettings = new JsonSerializerSettings() 
{ 
    ContractResolver = new UnderscorePropertyNamesContractResolver() 
}; 

public class UnderscorePropertyNamesContractResolver : DefaultContractResolver 
{ 
    public UnderscorePropertyNamesContractResolver() 
    { 
     NamingStrategy = new SnakeCaseNamingStrategy(); 
    } 
}   

는 다음, DeserializeObject 통화에 설정을 적용합니다. dynamic에 대상 유형을 전환,

string snakeJson = @"{""my_property"" : ""bar""}"; 

var payload = JsonConvert.DeserializeObject<Payload>(snakeJson, _snakeSettings); 

string typedProperty = payload.MyProperty; //contains "bar" 

OK : 정적 형식으로 직렬화의 경우, 이러한 설정이 성공적으로 JSON을 snake_case에 적용됩니다

var payload = JsonConvert.DeserializeObject<dynamic>(snakeJson, _snakeSettings); 

string typedProperty = payload.MyProperty; //is null 
string wrongProperty = payload.my_property; //is not null 

를 보시다시피, _snakeSettings이 시간을 무시하는 . 나는 이것이 버그라고 생각한다. JSON (snake_case) -> dynamic (PascalCase) 역 직렬화를 수행 할 수있는 해결 방법이 있습니까?

환경 : 당신이 JsonConvert.DeserializeObject<dynamic>를 호출 할 때

<TargetFramework>netcoreapp1.1</TargetFramework> 
<PackageReference Include="Newtonsoft.Json" Version="10.0.3" /> 

답변

2

그것이 JsonConvert.DeserializeObject<JObject>와 동일한 방식으로 작동합니다. JObject은 비 직렬화의 실제 결과가 아니지만 데이터의 일부 중간 상태이므로 독자에보다 오브젝트에 더 가깝습니다. 예 : 그것은 당신이 JSON의 일부만 비 직렬화 할 수 있도록
그래서 JsonConvert.DeserializeObject<dynamic>은 결과 객체가 아니라 JSON 데이터를위한 기능적 판독기를 생성합니다. 그 이유는 포스트 프로세싱없이 데이터를 보여주기 때문입니다.

"Newtonsoft.Json"개발자에게이 질문을하는 것이 좋습니다.

+0

감사합니다. 이것은 불분명 한 API의 좋은 예입니다. 나는이 문제를보고 할 것이고, 내가 시작한 이유는 공식적인 repo에서의 활동이 매우 낮다는 것입니다. –