Десериализовать c# структуру класса, содержащую RootObject - PullRequest
0 голосов
/ 24 марта 2020

У меня есть JSON результат API, который я обработал через онлайновую программу JSON -to- C#, чтобы создать структуру класса. Я использовал это много раз для других проектов. JSON вернул все вместе с публикуемым c классом RootObject, который ссылается на сегменты состояния и полезной нагрузки возвращаемых значений.

Я использую библиотеку ASP. NET C# для десериализации результата JSON, используя JavaScriptSerializer:

 var vlist = new JavaScriptSerializer().Deserialize<TestStruct>(result);

Моя структура данных выглядит так (довольно стандартный):

public class TestStruct
{
    public class Status
    {
        public int statusCode { get; set; }
        public int errorType { get; set; }
        public int errorCode { get; set; }
        public string errorMessage { get; set; }
    }

    public class Payload
    {
        public VehicleStatusRpt vehicleStatusRpt { get; set; }
    }

    public class VehicleStatusRpt
    {
        public string statusType { get; set; }
        //public ReportDate reportDate { get; set; }
        //public VehicleStatus vehicleStatus { get; set; }
    }

    public class RootObject
    {
        public Status status { get; set; }
        public Payload payload { get; set; }
    }
}

Полный JSON Результат, который я пытаюсь проанализировать с использованием структуры класса:

{
  "status": {
    "statusCode": 0,
    "errorType": 0,
    "errorCode": 0,
    "errorMessage": "Success with response body"
  },
  "payload": {
    "vehicleSummary": [
      {
        "vin": "KNDJX3AE8E7000080",
        "vehicleIdentifier": "000080",
        "modelName": "SOUL EV",
        "modelYear": "2015",
        "nickName": "My SOUL",
        "generation": 1,
        "extColorCode": "1D",
        "trim": "EV",
        "imagePath": {
          "imageName": "2015-soul_ev-ev-1d.png",
          "imagePath": "/content/dam/kia/us/owners/image/vehicle/2015/soul_ev/ev/",
          "imageType": "1",
          "imageSize": {
            "length": "100",
            "width": "100",
            "uom": 0
          }
        },
        "enrollmentStatus": 1,
        "fatcAvailable": 1,
        "telematicsUnit": 1,
        "fuelType": 4,
        "colorName": "CLEAR WHITE",
        "activationType": 1,
        "mileage": "24410",
        "dealerCode": "MOBISDLR1",
        "mobileStore": [
          {
            "osType": 0,
            "downloadURL": "https://itunes.apple.com/us/app/kia-access-with-uvo-link/id1280548773?mt=8",
            "image": {
              "imageName": "iosImage.png",
              "imagePath": "/content/dam/kia/us/owners/image/common/app/",
              "imageType": "2",
              "imageSize": {
                "length": "100",
                "width": "100",
                "uom": 0
              }
            }
          },
          {
            "osType": 1,
            "downloadURL": "https://play.google.com/store/apps/details?id=com.myuvo.link",
            "image": {
              "imageName": "androidImage.png",
              "imagePath": "/content/dam/kia/us/owners/image/common/app/",
              "imageType": "2",
              "imageSize": {
                "length": "100",
                "width": "100",
                "uom": 0
              }
            }
          }
        ],
        "supportedApp": {
          "appType": "5",
          "appImage": {
            "imageName": "app-access.png",
            "imagePath": "/content/dam/kia/us/owners/image/common/app/access/",
            "imageType": "2",
            "imageSize": {
              "length": "100",
              "width": "100",
              "uom": 0
            }
          }
        },
        "supportAdditionalDriver": 0,
        "customerType": 0,
        "vehicleKey": "937db044-8328-4188-a3d2-68ac3b183752"
      }
    ]
  }
}

Я запускаю этот файл через json2csharp.com, чтобы получить структуру (приведенный выше пример является только сокращенным «тестом»

Десериализатор возвращает ошибку: Неверный JSON Примитив (начиная с полезной нагрузки)

Я вижу примеры использования RootObject, но с Библиотека Newtonsoft JSON. Я хотел бы использовать библиотеку Microsoft. Мне действительно нужно переключиться на библиотеку Newtonsoft JSON? Если я могу использовать библиотеку JavaScriptSerializer, как?

1 Ответ

1 голос
/ 25 марта 2020

Классы, соответствующие JSON, которые вы опубликовали:

public class RootObject
{
    public Status status { get; set; }
    public Payload payload { get; set; }
}

public class Status
{
    public int statusCode { get; set; }
    public int errorType { get; set; }
    public int errorCode { get; set; }
    public string errorMessage { get; set; }
}

public class Payload
{
    public List<VehicleSummary> vehicleSummary { get; set; }
}

public class VehicleSummary
{
    public string vin { get; set; }
    public string vehicleIdentifier { get; set; }
    public string modelName { get; set; }
    public string modelYear { get; set; }
    public string nickName { get; set; }
    public int generation { get; set; }
    public string extColorCode { get; set; }
    public string trim { get; set; }
    public Image imagePath { get; set; }
    public int enrollmentStatus { get; set; }
    public int fatcAvailable { get; set; }
    public int telematicsUnit { get; set; }
    public int fuelType { get; set; }
    public string colorName { get; set; }
    public int activationType { get; set; }
    public string mileage { get; set; }
    public string dealerCode { get; set; }
    public List<MobileStore> mobileStore { get; set; }
    public SupportedApp supportedApp { get; set; }
    public int supportAdditionalDriver { get; set; }
    public int customerType { get; set; }
    public string vehicleKey { get; set; }
}

public class Image
{
    public string imageName { get; set; }
    public string imagePath { get; set; }
    public string imageType { get; set; }
    public ImageSize imageSize { get; set; }
}

public class ImageSize
{
    public string length { get; set; }
    public string width { get; set; }
    public int uom { get; set; }
}

public class MobileStore
{
    public int osType { get; set; }
    public string downloadURL { get; set; }
    public Image image { get; set; }
}

public class SupportedApp
{
    public string appType { get; set; }
    public Image appImage { get; set; }
}

Мне удалось десериализовать JSON просто отлично, используя JavaScriptSerializer, например:

var root = new JavaScriptSerializer().Deserialize<RootObject>(result);

где result - строка JSON, которую вы разместили в своем вопросе.

Обратите внимание, однако, что если вы поместили ваши классы в другой класс с именем TestStruct, вам нужно будет принять это во внимание и вместо этого десериализировать до TestStruct.RootObject, например:

var root = new JavaScriptSerializer().Deserialize<TestStruct.RootObject>(result);

Мне также удалось десериализовать JSON с использованием Json. Net таким же образом, как с классом JsonConvert:

var root = JsonConvert.DeserializeObject<RootObject>(result);

После того, как вы получили десериализованный объект, вы можете извлечь Немного интересной информации, например, такой:

foreach (var vs in root.payload.vehicleSummary)
{
    Console.WriteLine(string.Format("{0} - {1} {2} {3}, {4} mi", 
        vs.vin, vs.colorName, vs.modelYear, vs.modelName, vs.mileage));
}

Вот рабочая демонстрация с использованием Json. Net: https://dotnetfiddle.net/Zh35be

...