C # сериализация JSON из Twitter без данных члена - PullRequest
1 голос
/ 07 марта 2012

Я работаю над своим небольшим приложением Twitter на C #.Мне удалось сериализовать данные json из https://api.twitter.com/1/followers/ids.json?cursor=-1&screen_name= Возвращает что-то вроде этого:

{ "ids" : [ 401295021,
  506271294,
  14405250,
  25873220
],
"next_cursor" : 0,
"next_cursor_str" : "0",
"previous_cursor" : 0,
"previous_cursor_str" : "0"
}

Используя этот класс, я могу сериализовать его:

    [DataContract]
    public class TwitterFollowers
    {
        [DataMember(Name = "ids")]
        public IList<int> AccountIDs { get; set; }
    }

Теперь яхочу получить отображаемые имена подписчиков, поэтому я использую этот URL: http://api.twitter.com/1/users/lookup.json?user_id=

Этот json выглядит следующим образом:

[ { "contributors_enabled" : false,
"created_at" : "Wed Apr 16 06:30:52 +0000 2008",
"default_profile" : false,
"default_profile_image" : false,
"description" : "",
"utc_offset" : -25200,
"verified" : false
},
{ "contributors_enabled" : false,
"created_at" : "Tue Mar 04 12:31:57 +0000 2008",
"default_profile" : true,
"default_profile_image" : false,
"description" : "",
"utc_offset" : 3600,
"verified" : false
}
]

Как видите, массив начинается сразу, безназывая это.Как должен выглядеть мой класс, чтобы сериализовать это?

Я пробовал это, но это не работает:

    [DataContract]
    public class TwitterProfiles
    {
        [DataMember(Name = "")]
        public IList<TwitterProfile> Profiles { get; set; }
    }

    [DataContract]
    public class TwitterProfile
    {
        [DataMember(Name = "lang")]
        public string Language { get; set; }

        [DataMember(Name = "location")]
        public string Location { get; set; }

        [DataMember(Name = "name")]
        public string Name { get; set; }

        [DataMember(Name = "screen_name")]
        public string ScreenName { get; set; }

        [DataMember(Name = "url")]
        public string URL { get; set; }
    }

Ответы [ 2 ]

0 голосов
/ 07 марта 2012

Предоставленный вами образец не соответствует членам класса TwitterProfile. Несмотря на это, вам не нужен вспомогательный класс для обработки массива. Вы можете просто указать тип массива непосредственно при десериализации.

Вот пример кода, который вы можете использовать для тестирования. Я удалил ваш класс TwitterProfiles и сократил TwitterProfile до поля с именем CreatedAt.

Обратите внимание на следующую строку в источнике ниже:

DataContractJsonSerializer js = 
    new DataContractJsonSerializer(typeof(TwitterProfile[]));

Вот и все остальное.

using System.Windows.Forms;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.IO;

namespace TwProfileJson
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            OpenFileDialog dlg = new OpenFileDialog();
            if (dlg.ShowDialog() != DialogResult.OK) { return; }
            string json = System.IO.File.ReadAllText(dlg.FileName);

            using(MemoryStream stm = new MemoryStream(Encoding.UTF8.GetBytes(json)))
            {
                DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(TwitterProfile[]));
                TwitterProfile[] pps = (TwitterProfile[])js.ReadObject(stm);

                foreach(TwitterProfile p in pps)
                {
                    Console.WriteLine(p.CreatedAt);
                }
            }

            Console.ReadKey();
        }

        [DataContract]
        public class TwitterProfile
        {
            [DataMember(Name = "created_at")]
            public string CreatedAt { get; set; }
        }
    }
}
0 голосов
/ 07 марта 2012

Вы пытались удалить свойство «Имя» из атрибута DataMember вместе? Значение:

[DataMember]
public IList<TwitterProfile> Profiles { get; set; }

Если это не сработает, один из вариантов, который вы также можете сделать, это получить выходные данные вызова API и отформатировать его в строку json, которую, как вы знаете, можно десериализовать:

string.Format("{{\"profiles\":{0}}}", GetJsonResponse())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...