2016-02-29 10 views
-1

Я пытаюсь проверить, есть ли в json определенное свойство. На самом деле я могу сделать это следующим образом:Json вернулся с пробелом

var container = (JContainer)JsonConvert.DeserializeObject(responseText); 
var x = container.ToString(Formatting.None); 
var message = container["text"]; 

Теперь переменной responseText возвращается как:

{[ 
{ 
    "trace": { 
     "details": { 
     "data": "[29-02-2016 17:37:32.931751]", 
     "type": "[info]", 
     "text": "[Done.]" 
     }, 
     "context": { 
     "context": [ 
      [ 
      { 
       "ID": "John Dillinger" 
      } 
      ] 
     ] 
     } 
    } 
    } 
]} 

в переменной x я удалил пространство и конечный результат:

"[{\"trace\":{\"details\":{\"data\":\"[29-02-2016 17:37:32.931751]\",\"type\":\"[info]\",\"text\":\"[Done.]\"},\"context\":{\"context\":[[{\"ID\":\"John Dillinger\"}]]}}}]" 

Теперь, если ключ не найден, я получаю null:

if (message == null) 
{ 
     return responseText; 
} 

проблема заключается в том, что я выполняю условие на переменную message, что проверить, если в container (не отформатирован) есть свойство, проблема в том, что я получаю это исключение:

{ "Accessed Значения JArray с недопустимым значением ключа: \ "text \". Int32 Индекс массива ожидается. "}

, но если я заменю container со вторым JSON с слэшем все работает хорошо. Теперь моя проблема заключается в том, что я не могу выполнить var message= x["text"]; потому x является строкой. Так как я может удалить пробел в json и проверить, есть ли ключ text?

+0

Почему бы не просто прочитать его от 'container'? Я не понимаю, почему вам нужно удалить все пробелы перед чтением этого свойства? –

+0

@JamesThorpe, потому что если я прочитаю из контейнера, я получаю: '{" Доступные значения JArray с недопустимым значением ключа: \ "text \". Индекс массива Int32 ожидается. "}' В частности кажется, что литье 'JContainer' добавляет пространство, которое сломал json. Вместо этого, если я вернусь к переменной образца, содержащей json, я получаю результат достижения, но мне нужно получить его из переменной, содержащей запрос. – Sandokan

+1

Вы понимаете, что ничего не делаете? x - это место, где вы удаляете пробелы, но вы не используете его ни для чего ... – Gusman

ответ

1

Похоже, что когда вы удалили пространство, вы также изменили порядок первых скобок. В первом примере ваши первые скобки: {[, во втором они являются [{

В json, порядок имеет значение. {} означает объект и [] означает массив. [{"data":"value"}] является законным, потому что вы говорите, что у вас есть массив объекта. {["value"]} не является законным, поскольку ваш объект не имеет имени для массива. Правовая версия будет { "data":["value"] }

Here представляет собой удобный инструмент для создания веб, чтобы проверить ваш синтаксис JSON

+0

Это не проблема синтаксиса, потому что в другом классе я могу десериализовать json правильно. Это проблема десериализации, которая вызывает исключение. – Sandokan

+0

Я вставлял свой JSON в JSONLint, и он вернулся как действующий? – dman2306

+0

@ dman2306 json действительно. Это просто массив объекта. – Sandokan

Смежные вопросы