json.NET проблема с синтаксическим анализом данных API twitter

#c# #twitter #json.net

#c# #Twitter #json.net

Вопрос:

Я использовал json.NET успешно работает в проектах в течение некоторого времени без каких-либо проблем. Прошлой ночью я столкнулся со своим первым случаем, когда json.Сбой СЕТИ при попытке проанализировать данные json, возвращенные из того, что должно быть надежным источником: API twitter.

В частности, этот код вызывает ошибку:

 string sCmdStr = String.Format("https://api.twitter.com/1/users/lookup.json?screen_name={0}", sParam);
string strJson = _oauth.APIWebRequest("GET", sCmdStr, null);
JObject jsonDat = JObject.Parse(strJson);
  

В моем случае строка sParam содержала около 25 цифровых идентификаторов twitter. Вызов API twitter прошел успешно, но json.Сбой СЕТЕВОГО синтаксического анализа со следующей ошибкой:

«Ошибка при чтении JObject из JsonReader. Текущий элемент JsonReader не является объектом: StartArray»

Кто-нибудь еще сталкивался с этим? Кто-нибудь знает какой-нибудь способ обойти это? Я нахожусь в тупике, пока не решу ее.

Комментарии:

1. Я мало что знаю об api Twitter, но источник на самом деле не должен иметь значения. Не могли бы вы привести нам пример того, что будет содержать strJson?

2. Да, вы можете увидеть пример данных json, возвращаемых Twitter, здесь: bit.ly/t8KBba .

3. @DrewStoddard Если бы вы попробовали мой ответ, вы бы увидели, что не так с JObject.Parse и почему мой Json. Класс расширения Net работает хорошо. Но, похоже, вам это не интересно, я удалил ответ.

4. @L.B Жаль, что вы удалили это, люди, отличные от OP, могли бы найти это полезным.

Ответ №1:

Я получал точно такую же ошибку и в конце концов разобрался с этим. Вместо использования JObject.Parse используйте JArray.Выполните синтаксический анализ. Итак, вот ваш код:

 string sCmdStr = String.Format("https://api.twitter.com/1/users/lookup.json?screen_name={0}", sParam);
string strJson = _oauth.APIWebRequest("GET", sCmdStr, null);
JArray jsonDat = JArray.Parse(strJson);
  

Затем вы можете выполнить цикл по массиву и создать jobject для каждого отдельного твита.

 for(int x = 0; x < jsonDat.Count(); x  )
{
     JObject tweet = JObject.Parse(jsonDat[x].toString());
     string tweettext = tweet["text"].toString();
     //whatever else you want to look up
}
  

Комментарии:

1. Спасибо вам за это. Похоже, что это может решить конкретную проблему, с которой мы столкнулись. После нескольких подобных проблем с классами чтения json мы решили полностью отказаться от json в случае twitter API и использовать их протокол XML. Это было хорошее решение, поскольку с тех пор мы смогли двигаться с гораздо более высокой скоростью разработки. XML может быть более подробным, но из-за его зрелости и поддержки его сложно превзойти.