Я работаю над приложением Server-Client. У Клиента есть поток, основная цель которого — получение от сервера «состояния комнаты».
Моя проблема заключается в десериализации пакета JSON в объект С#.
public class roomState //This is the class that I want to create
{
public int isActive { get; set; }
public int questionCount { get; set; }
public int answerTimeOut { get; set; }
public JArray players { get; set; }
}
string jsonObject = "{\"isActive\":<int>,\"questionCount\":<int>,\"answerTimeOut\":<int>,\"players\": [\"name1\",\"name2\",\"name3\"....]}"
приведенная выше строка является примером того, что я получаю от сервера. Как мне это десериализовать?
* Я использую Newtonsoft.Json.Linq, но не ограничиваюсь только этим.
Заранее спасибо, Антон





Вы можете использовать Newtonsoft.Json для этой цели:
public RoomState DeserializingMyRoomState()
{
string jsonObject = "{\"isActive\":<int>,\"questionCount\":<int>,\"answerTimeOut\":<int>,\"players\": [\"name1\",\"name2\",\"name3\"....]}";
RoomState myRoomState = JsonConvert.DeserializeObject<RoomState>(jsonObject);
return myRoomState;
}
И, пожалуйста, при именовании класса в C# я бы посоветовал вам использовать Pascal Case, поэтому ваш класс должен называться RoomState.
ОБНОВИТЬ: Кроме того, рассмотрите возможность структурирования всех ваших классов, которые будут использоваться для сериализации/десериализации JSON, следующим образом:
public class RoomState
{
[JsonProperty("isActive")]
public int IsActive { get; set; }
[JsonProperty("questionCount")]
public int QuestionCount { get; set; }
[JsonProperty("answerTimeOut")]
public int AnswerTimeOut { get; set; }
[JsonProperty("players")]
public List<string> Players { get; set; }
}
Большое спасибо! Я пробовал, но теперь я знаю, почему это не сработало!
Ошибка Имя «JsonConvert» не существует в текущем контексте. Что мне нужно включить? (используя Newtonsoft....)
Просто добавьте: использование Newtonsoft.Json; Конечно, убедитесь, что этот пакет установлен в вашем решении/проекте.
Вам нужен nuget Newtonsoft.Json.
Да, я просто использовал весь путь пространства имен, и это сработало. Но теперь он не может десериализовать игроков: {"Ошибка преобразования значения \"[\"an123\"]\" в тип "System.Collections.Generic.List`1[System.String]". Путь "игроков", строка 1, позиция 59."} Newtonsoft.Json.JsonSerializationException
@AnthonNaivelt Пожалуйста, ознакомьтесь с моим обновленным ответом. Старайтесь всегда использовать этот шаблон для своих классов на C#.
Это также находится внутри Newtonsoft.Json.
Спасибо, я нашел это.
Он по-прежнему не может десериализовать игроков
+ $exception {"Ошибка преобразования значения \"[\"an123\"]\" в тип "System.String[]". Путь "players", строка 1, позиция 59."} Newtonsoft.Json.JsonSerializationException
Можете ли вы скопировать json, который вы пытаетесь разобрать, я проверю его локально?
ответ "{\"Время ожидания ответа\":5,\"isActive\":false,\"игроков\":\"[\\\"an123\\\"]\",\"Количество вопросов \":5}" строка
почему 3 слэша до и после имени?
Я фиксирую порядок класса
public class roomState { [Newtonsoft.Json.JsonProperty ("answerTimeout")] public int answerTimeout { get; задавать; } [JsonProperty("isActive")] public bool isActive { get; задавать; } [JsonProperty("players")] общедоступная строка[] игроки { get; задавать; } [JsonProperty("questionCount")] public int questionCount { get; задавать; } }
Просто скопируйте класс после исправления и строку
Я не знаю, как и откуда вы берете этот JSON, но он определенно неправильно структурирован. В настоящее время вы ожидаете список или массив строк [], и это должен быть просто список или массив строк. Попробуйте жестко закодировать свой JSON следующим образом: string jsonObject = "{\"answerTimeout\":5,\"isActive\":false,\"players\": [\"an123\"],\"questionCount\":5} ", а затем десериализуйте его, он должен работать.
У меня нет кода сервера, я работаю над клиентом. И что я должен делать?
Я позвонил программисту сервера, и он устранил проблему. Спасибо большое
Пожалуйста! Был способ справиться с этим и на стороне клиента, но это был определенно не лучший способ. Теперь ты можешь идти.
Вы также можете использовать Fluent-JSON.NET, если не хотите загрязнять свои модели атрибутами.
public class RoomStateMap: JsonMap < RoomState > {
public RoomStateMap() {
this.Map(x => x.isActive, "isActive");
this.Map(x => x.questionCount, "questionCount");
this.Map(x => x.answerTimeOut, "answerTimeOut");
this.Map(x => x.players, "players");
}
}
Я добавлю, что вы должны использовать List<string> вместо JArray, если вы хотите изменить список, или string[], если вы этого не делаете.