Десериализовать объект JSON, содержащий JArray, в объект C#

Я работаю над приложением 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, но не ограничиваюсь только этим.

Заранее спасибо, Антон

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
214
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать 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; }
}

Я добавлю, что вы должны использовать List<string> вместо JArray, если вы хотите изменить список, или string[], если вы этого не делаете.

Guilhem Prev 02.07.2019 10:15

Большое спасибо! Я пробовал, но теперь я знаю, почему это не сработало!

Anthon Naivelt 02.07.2019 10:19

Ошибка Имя «JsonConvert» не существует в текущем контексте. Что мне нужно включить? (используя Newtonsoft....)

Anthon Naivelt 02.07.2019 10:25

Просто добавьте: использование Newtonsoft.Json; Конечно, убедитесь, что этот пакет установлен в вашем решении/проекте.

zpouip 02.07.2019 10:31

Вам нужен nuget Newtonsoft.Json.

Nenad 02.07.2019 10:33

Да, я просто использовал весь путь пространства имен, и это сработало. Но теперь он не может десериализовать игроков: {"Ошибка преобразования значения \"[\"an123\"]\" в тип "System.Collections.Generic.List`1[System.String]". Путь "игроков", строка 1, позиция 59."} Newtonsoft.Json.JsonSerializationException

Anthon Naivelt 02.07.2019 10:42

@AnthonNaivelt Пожалуйста, ознакомьтесь с моим обновленным ответом. Старайтесь всегда использовать этот шаблон для своих классов на C#.

zpouip 02.07.2019 10:53

Это также находится внутри Newtonsoft.Json.

zpouip 02.07.2019 10:57

Спасибо, я нашел это.

Anthon Naivelt 02.07.2019 10:58

Он по-прежнему не может десериализовать игроков

Anthon Naivelt 02.07.2019 11:00

+ $exception {"Ошибка преобразования значения \"[\"an123\"]\" в тип "System.String[]". Путь "players", строка 1, позиция 59."} Newtonsoft.Json.JsonSerializationException

Anthon Naivelt 02.07.2019 11:02

Можете ли вы скопировать json, который вы пытаетесь разобрать, я проверю его локально?

zpouip 02.07.2019 11:04

ответ "{\"Время ожидания ответа\":5,\"isActive\":false,\"игроков\‌​":\"[\\\"an123\\\"]\‌​",\"Количество вопросов \":‌​5}" строка

Anthon Naivelt 02.07.2019 11:06

почему 3 слэша до и после имени?

Anthon Naivelt 02.07.2019 11:07

Я фиксирую порядок класса

Anthon Naivelt 02.07.2019 11:07

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; задавать; } }

Anthon Naivelt 02.07.2019 11:08

Просто скопируйте класс после исправления и строку

Anthon Naivelt 02.07.2019 11:08

Я не знаю, как и откуда вы берете этот JSON, но он определенно неправильно структурирован. В настоящее время вы ожидаете список или массив строк [], и это должен быть просто список или массив строк. Попробуйте жестко закодировать свой JSON следующим образом: string jsonObject = "{\"answerTimeout\":5,\"isActive\":false,\"players\": [\"an123\"],\"questionCount\":5} ", а затем десериализуйте его, он должен работать.

zpouip 02.07.2019 11:15

У меня нет кода сервера, я работаю над клиентом. И что я должен делать?

Anthon Naivelt 02.07.2019 11:19

Я позвонил программисту сервера, и он устранил проблему. Спасибо большое

Anthon Naivelt 02.07.2019 11:24

Пожалуйста! Был способ справиться с этим и на стороне клиента, но это был определенно не лучший способ. Теперь ты можешь идти.

zpouip 02.07.2019 11:24

Вы также можете использовать 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");
  }
}

Другие вопросы по теме