Десериализовать объект JSON в C # с помощью JSON.NET или JavaScriptSerializer - PullRequest
1 голос
/ 01 мая 2011

прошу прощения, если об этом спрашивали раньше, но я попытался найти здесь несколько ответов, но я не смог их найти.

В любом случае, у меня похожая проблема с этим вопросом: Разбор JSON с использованием Json.net

это решает некоторую проблему, но я запутался в моих данных JSON. вот данные JSON

{
   "messages":[
      {
         "message":"hilo",
         "timestamp":"23:55",
         "uid1":"7",
         "name":"shiftypowers"
      }
   ],
   "total_messages":"1",
   "last_timestamp":"1304265309",
   "buddylist":{
      "476":{
         "name":"Gandang_hari",
         "status":"1"
      },
      "506":{
         "name":"ichigo",
         "status":"1"
      },
      "186":{
         "name":"Jinn",
         "status":"1"
      },
      "7":{
         "name":"shiftypowers",
         "status":"1"
      },
      "total":4
   }
}

Если вы заметили цифры 476, 506, 186 и 7 - это были идентификаторы пользователей, и я собираюсь разобраться с тысячами идентификаторов пользователей в будущем.

Вопрос в том, как это десериализовать?

вот мой код

public class ElakoChatPollData
    {
        public ElakoChatPollData()
        {
            messages = new List();
        }
        public List messages { get; set; }
        public string total_messages { get; set; }
        public string last_timestamp { get; set; }
        public buddylist buddylist { get; set; }
    }

    public class messages
    {
        public string message { get; set; }
        public string timestamp { get; set; }
        public string uid1 { get; set; }
        public string name { get; set; }
    }

    public class buddylist
    {
        // what should I put here ??
        //public List uid { get; set; } // i don't think this is correct
        public Dictionary Users { get; private set; }
        public string total { get; set; }
    }

    public class userinfo
    {
        public string name { get; set; }
        public string status { get; set; }
    }

// and serializing the json looks like this
JavaScriptSerializer ser = new JavaScriptSerializer();
ChatPollData epd = ser.Deserialize<ChatPollData>(jsonchatpoll);
Console.Writeline(epd.buddylist.Users[0].name); // i get Object reference not set ~~~~

если приведенный выше код правильный .. как я могу получить идентификаторы пользователя? и кстати, данные json будут запрашиваться из модуля drupal (drupalchat)

Ответы [ 2 ]

0 голосов
/ 08 апреля 2019

Я думаю, что вы можете использовать библиотеку Newtonsoft.Json для процесса сериализации или десериализации.

Значение Id должно быть в объекте BuddyList (это мое мнение)

Если ваш ответ такой:

{
    "messages": [{
        "message": "hilo",
        "timestamp": "23:55",
        "uid1": "7",
        "name": "shiftypowers"
    }],
    "total_messages": "1",
    "last_timestamp": "1304265309",
    "buddylist": [{
            "id": 476,
            "name": "Gandang_hari",
            "status": "1"
        }, {
            "id": 506,
            "name": "ichigo",
            "status": "1"
        }, {
            "id": 186,
            "name": "Jinn",
            "status": "1"
        },
        {
            "id": 7,
            "name": "shiftypowers",
            "status": "1"
        }
    ]
}

Вы можете создать объект ответа для десериализации:

public class Message
{
    public string message { get; set; }
    public string timestamp { get; set; }
    public string uid1 { get; set; }
    public string name { get; set; }
}

public class Buddylist
{
    public int id { get; set; }
    public string name { get; set; }
    public string status { get; set; }
}

public class ElakoChatPollData
{
    public List<Message> messages { get; set; }
    public string total_messages { get; set; }
    public string last_timestamp { get; set; }
    public List<Buddylist> buddylist { get; set; }
}

Если вы хотите сериализировать этот объект:

string _serialized = JsonConvert.SerializeObject(_yourObject);

Для десериализации:

var _data = JsonConvert.DeserializeObject<ElakoChatPollData>(_serialized);
0 голосов
/ 01 мая 2011

Одним из простых решений является использование классов linq-to-json, включенных в библиотеку newtonsoft json.Затем вам нужно вручную создать экземпляры ваших объектов, но, учитывая ваш очень простой формат файла, который не должен занимать много времени.

Приятно делать это вручную, поскольку формат данных и ваш формат в памятисовсем другое.

 // public List<userinfo> uid { get; set; }; // i don't think this is correct
 public Dictionary<int,UserInfo> Users{get;private set;}//I might use something like this
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...