2016-11-29 12 views
5

にJSONを解析する際に小文字にすべてのキーを変更し、キーは大文字と小文字を持ってする方法:私はJSONの文字列を持っているJToken

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

は私がJTokenオブジェクトに変換し、持っていたいすべてのJTokenのキーは小文字にしてください。だから、内部的に次のようにJTokenで、それは次のようになります。

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

以前私が変換することJToken json = JToken.Parse(jsonString);を使用していたが、私は、キーを小文字にする方法を見つけることができません。 アイデア?

私がこれを行う必要があるのは、私のJsonSchema検証で大文字小文字を区別しないようにするためです。

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を続けるので、これは動作します:最小限のコードでこれを解決するために

+0

JPropertyにはNameのgetterしかありませんので、問題を変更することになります。 – mybirthname

+0

真。私は、解析メカニズムをカスタマイズする方法がいくつかあると考えていました。構文解析を編集するreviverパラメータ(https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse)を持つjs parse関数と同様です。私は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

可能な方法の1つは、JsonTextReaderをサブクラス化し、現在のTokenTypePropertyNameあるたび小文字の文字列を返すようにValueプロパティをオーバーライドすることですTokenTypeが内部状態が変化すると更新され、シリアライザ(実際にはJsonSerializerInternalReaderクラス)は、Valueプロパティを介してリーダーからプロパティ名を取得するときにそれに依存します。

カスタムリーダーを使用してデシリアライズすることを容易にするために、短いヘルパーメソッドを作成することができます。

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 = JToken.Parse(jsonString); 

JToken json = JsonHelper.DeserializeWithLowerCasePropertyNames(jsonString); 

フィドール:https://dotnetfiddle.net/A0S3I1

+0

これはまさに私が探していた解決策です。最も効率的な構文解析では小文字に変わります。 – Rafi

関連する問題