2014-11-03 4 views
3

У меня есть действительный объект JSON, который содержит несколько ключей «en-US», которые я пытаюсь выбрать. Для этой цели я использую JsonPathJson.NET SelectTokens не работает, если json содержит пустой массив

"$..en-US" 

которое дается в порядке, SelectTokens реализуемого Json.NET. Это среда JSON для .NET. Все работает отлично и хорошо, пока мой 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); 

Здесь лексемы переменная будет содержать только один элемент! Это будет происхождение «en-US» перед пустым массивом в «элементах управления» объекта «header». Однако, когда я просто оставить это «заголовок» объект из:

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

я буду получать все 3 occurencies на «EN-US», как и ожидалось. Btw, если я проверю свой JsonPath на первом объекте JSON (т. Е. Который содержит пустой массив) в an online tool, то, как и ожидалось, я получаю все три случая «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 будет содержать те же токены, которые вы получили бы с помощью селектора, который вы пытались использовать раньше.