2014-11-03 73 views
3

我有一個包含多個「en-US」鍵的有效JSON對象,我試圖選擇它。爲此,我使用JsonPath如果json包含空數組,Json.NET SelectToken不起作用

"$..en-US" 

它被給予由Json.NET實現的SelectTokens過程。這是一個.NET的JSON框架。只要我的JSON不包含任何空數組,一切工作都很好。 下面是一個例子:

var myJsonPath = "$..en-US"; 
var myJson = 
     @"{ 
      'controls': [ 
       { 
        'messages': { 
         'addSuggestion': { 
          'en-US': 'Add' 
         } 
        } 
       }, 
       { 
        'header': { 
         'controls': [] 
        }, 
        'controls': [ 
         { 
          'controls': [ 
           { 
            'defaultCaption': { 
             'en-US': 'Sort by' 
            }, 
            'sortOptions': [ 
             { 
              'label': { 
               'en-US': 'Name' 
              } 
             } 
            ] 
           } 
          ] 
         } 
        ] 
       } 
      ] 
     }"; 
var jToken = JObject.Parse(myJson); 
var tokens = jToken.SelectTokens(myJsonPath); 

這裏,令牌變量將僅包含一個元素!這將是'header'對象的'controls'中的空數組之前的「en-US」發生。然而,當我剛離開這個「頭」對象了:

var myJson = 
    @"{ 
     'controls': [ 
      { 
       'messages': { 
        'addSuggestion': { 
         'en-US': 'Add' 
        } 
       } 
      }, 
      { 
       'controls': [ 
        { 
         'controls': [ 
          { 
           'defaultCaption': { 
            'en-US': 'Sort by' 
           }, 
           'sortOptions': [ 
            { 
             'label': { 
              'en-US': 'Name' 
             } 
            } 
           ] 
          } 
         ] 
        } 
       ] 
      } 
     ] 
    }"; 

我會得到所有的「EN-US」的3個occurencies預期。順便說一句,如果我在an online tool的第一個JSON對象(即包含一個空數組)的第一個JSON對象上驗證我的JsonPath,那麼正如我所料,我得到了所有三個「en-US」的情況。這與我從Json.NET中得到的不同。我想知道這是一個錯誤還是我不得不手動處理這種情況?

回答

1

這是一個已修復的錯誤。升級到最新版本的Json.NET。

0

如果在相同的情況下我在哪裏,你有點卡住關於更新Json.NET的版本的時候,你可以解決這個問題沿着這行做的事情:

IEnumerable<JValue> vals = jToken 
    .Desecendants() 
    .Where(w => w is JProperty && w.Name=="en-US") 
    .Select(s => s.Value); 

希望有幫助! vals數組將包含您使用之前嘗試使用的選擇器獲得的相同令牌。

相關問題