2016-11-29 101 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驗證將不區分大小寫。

+0

JProperty所以我認爲你將有問題的改變它只有getter方法名稱。 – mybirthname

+0

是的。我認爲有一些方法來定製解析機制。類似具有齊磊參數(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-基地 – mybirthname

回答

4

用最少的代碼來解決這個問題的一種可能的方式是繼承JsonTextReader並覆蓋Value屬性返回一個小寫的字符串,只要當前TokenTypePropertyName

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更新其內部狀態的變化,以及串行化(實際上是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