2016-11-29 5 views
5

에 JSON을 구문 분석 할 때 소문자로 모든 키를 변경하고 키는 대문자와 소문자를하는 방법 :내가 JSON의 문자열을 가지고 JToken

{"employees":[ 
    {"FIrstName":"John", "LASTname":"Doe"}, 
    {"FIRSTNAME":"Anna", "LaSTNaME":"Smith"}, 
    {"firstName":"Peter", "lastName":"Jones"} 
]} 

은 내가 JToken 객체로 변환하고이 원하는 모든 JToken의 키는 소문자 여야합니다.

{"employees":[ 
    {"firstname":"John", "lastname":"Doe"}, 
    {"firstname":"Anna", "lastname":"Smith"}, 
    {"firstname":"Peter", "lastname":"Jones"} 
]} 

은 이전에 내가 변환 JToken json = JToken.Parse(jsonString);를 사용했다,하지만 난 소문자 키를 만드는 방법을 찾을 수 없습니다 다음과 같이 그래서 내부적으로 JToken에가 있어야한다. 아이디어가 있으십니까?

이렇게해야하는 이유는 내 JsonSchema 유효성 검사에서 대소 문자를 구분하지 않기 때문입니다.

+0

JProperty에는 Name에 대한 getter 만 있으므로 변경할 때 문제가 발생할 것이라고 생각합니다. – mybirthname

+0

참. 파싱 ​​메커니즘을 사용자 정의 할 수있는 방법이 있다고 생각했습니다. 구문 분석을 편집하기 위해 reviver 매개 변수 (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse)가있는 js 구문 분석 함수와 비슷합니다. json.net에서 사용자 정의하는 방법을 잘 모르겠습니다. – Rafi

+0

사용자 지정 Json 변환기를 만들려면이 것을 확인하십시오. 나는 그것이 귀하의 현재 사건에 도움이 될지 모르겠다 : http : //stackoverflow.com/questions/8030538/how-to-implement-custom-jsonconverter-in-json-net-to-deserialize-a-list- of-base – mybirthname

답변

4
최소한의 코드로이 문제를 해결하는 한 가지 방법은 JsonTextReader를 서브 클래스 화해, 현재 TokenTypePropertyName 때마다 소문자 문자열을 반환 Value 속성을 재정의하는 것입니다

이 작동

public class LowerCasePropertyNameJsonReader : JsonTextReader 
{ 
    public LowerCasePropertyNameJsonReader(TextReader textReader) 
     : base(textReader) 
    { 
    } 

    public override object Value 
    { 
     get 
     { 
      if (TokenType == JsonToken.PropertyName) 
       return ((string)base.Value).ToLower(); 

      return base.Value; 
     } 
    } 
} 

가 기본이 JsonTextReader가를 유지하기 때문에 TokenType은 내부 상태가 변경되어 업데이트되며 serializer (실제로는 JsonSerializerInternalReader 클래스)는 Value 속성을 통해 리더에서 속성 이름을 검색 할 때 의존합니다. 이와

JToken json = JToken.Parse(jsonString); 

: : 코드에서 다음

public static class JsonHelper 
{ 
    public static JToken DeserializeWithLowerCasePropertyNames(string json) 
    { 
     using (TextReader textReader = new StringReader(json)) 
     using (JsonReader jsonReader = new LowerCasePropertyNameJsonReader(textReader)) 
     { 
      JsonSerializer ser = new JsonSerializer(); 
      return ser.Deserialize<JToken>(jsonReader); 
     } 
    } 
} 

그냥이 대체 :

당신은 쉽게 사용자 정의 판독기를 사용하여 직렬화하는 것은 있도록 짧은 도우미 메서드를 만들 수 있습니다

JToken json = JsonHelper.DeserializeWithLowerCasePropertyNames(jsonString); 

피들 : https://dotnetfiddle.net/A0S3I1

+0

이것은 정확히 내가 찾던 해결책이다. 가장 효과적 인 구문 분석에서 소문자로 바뀝니다. – Rafi