JsonConvert не работает со списком структур внутри класса - PullRequest
0 голосов
/ 14 октября 2018

Здравствуйте, я хочу десериализовать класс, который содержит string, bool и List<[mystructtype>;
. При использовании JsonConvert.Deserialize<[myclass]> он десериализует string и bool правильно, но неList<[Struct]>. Я также изменил List<struct> с массивом structs.
И контейнер class, и struct помечены Serializeable, и я не понимаю, в чем проблема.Кто-нибудь может мне помочь?

Структура
[Serializable] public struct Status { //identifiers public long playerId { get; set; } public long groupId { get; set; } public int type { get; set; } }

Контейнер класса

[Serializable]
    class GatewayDeviceResponse
    {
        public bool status { get; set; }  //gets deserialized good
        public string message { get; set; } //gets deserialized good

        public Status[] data { get; set; }   // all members  are defaults
    }

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

IRestResponse response = client.Execute(request);
                string result = Encoding.UTF8.GetString(response.RawBytes);

                GatewayDeviceResponse resp = JsonConvert.DeserializeObject<GatewayDeviceResponse>(result);
                return resp.data.ToList();

PS Строка является ответом от webserver, и я использую RestSharp для создания запроса к серверу и получения ответа.это response строка хорошая. class это deserialized хорошо, исключая collection.

В чем может быть проблема?

PS строковый ответ от сервера, который я получаю:

   "{  
   \"status\":true,
   \"message\":\"ok\",
   \"data\":[  
      {  
         \"status\":{  
            \"playerId\":59,
            \"groupId\":26,
            \"type\":2,
            \"deviceId\":\"abababa",
            \"groupName\":\"srl\",
            \"playerName\":\"Adrian\"
         }
      },
      {  
         \"status\":{  
            \"playerId\":25,
            \"groupId\":26,
            \"type\":1,
            \"deviceId\":\"lalal\",
            \"groupName\":\"srl\",
            \"playerName\":\"Alex\"
         }
      }
   ]
}"

Элементы массива Status[] не должны быть полностью заполнены ответом сервера, только 3 поля, которые я разместил в POCO /

1 Ответ

0 голосов
/ 15 октября 2018

Я написал модульный тест, как показано ниже, и он прошел и правильно десериализован с помощью Restsharp.Можете ли вы заменить строку ответа и классы, чтобы проверить, что модульный тест еще прошел?

Может быть, ваше представление класса не подходит для вашего ответа.Получите небольшую помощь от http://json2csharp.com/ и убедитесь, что ваши классы правильно представляют ваш json.

[Test]
public void Can_Deserialize_Struct()
{
    var data = "{ \"myList\":[{\"name\": \"test1234\"}] }";

    JsonDeserializer json = new JsonDeserializer();
    var output = json.Deserialize<MyTest>(new RestResponse { Content = data });

    Assert.NotNull(output);
}

class MyTest
{
    public List<MyStruct> MyList { get; set; }
}

struct MyStruct
{
    public String name { get; set; }
}

Согласно вашей строке ответа, ваши классы c # должны представлять ваш json, как показано ниже:

public class Status
{
    public int playerId { get; set; }
    public int groupId { get; set; }
    public int type { get; set; }
    public string deviceId { get; set; }
    public string groupName { get; set; }
    public string playerName { get; set; }
}

public class StatusData
{
    public Status status { get; set; }
}

public class GatewayDeviceResponse
{
    public bool status { get; set; }
    public string message { get; set; }
    public List<StatusData> data { get; set; }
}

Это не связано с типом struct или class.Вам нужно добавить еще один класс перед вашим классом представления статуса.Потому что он начинается как объект json в строке ответа.

...