Десериализация JSON: ввод не является допустимой строкой Base-64, так как содержит не базовый 64-символ - PullRequest
0 голосов
/ 12 апреля 2020

Проблема:

Я просто не могу понять, что не так с JSON ниже.

Ошибка:

'The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or an illegal character among the padding characters.'

Тест:

Я запустил инструмент проверки JSON на нем, и он прошел как действительный JSON. Однако я продолжаю получать ошибку преобразования base-64.

{
  "Courier": {
    "CourierId": "e168d837-0f0e-4f61-8a3d-725b53d11277",
    "Name": "Jeremy Bot",
    "ProfileImage": "undefined_image",
    "LastLocation": {
      "Latitude": 25.87427,
      "Longitude": -80.12173
    },
    "IsSubscribed": true,
    "Timestamp": "2020-04-11T19:11:21.1821483-04:00"
  },
  "Request": {
    "RequestId": "78d31dab-e631-4f95-aa31-d95b218a1850",
    "Customer": {
      "CustomerId": "some_customer_id",
      "Name": "John Doe",
      "Location": {
        "Latitude": 25.87427,
        "Longitude": -80.12173
      },
      "Phone": "(XXX-XXX-XXXX)"
    },
    "Carriers": {
      "Restaurants": [],
      "Stores": []
    }
  },
  "ETA": "30 minutes"
}

Тест 2:

Я думал, что причиной может быть отрицательное число в моем JSON.

Однако следующее не сработало:

let handleNegativeValues = JsonSerializerSettings(FloatParseHandling=FloatParseHandling.Decimal)

let payload = JsonConvert.DeserializeObject<'T>(json, handleNegativeValues)

Причина:

Вот код, который я выполняю и который приводит к ошибка:

let payload = JsonConvert.DeserializeObject<'T>(json)

Приложение:

Вот тип root, который я пытаюсь десериализовать в:

[<DataContract>]
type CourierAcceptedSubmission = {

    [<field: DataMember(Name="Courier")>]
    Courier  : Courier

    [<field: DataMember(Name="Request")>]
    Request  : Request

    [<field: DataMember(Name="ETA")>]
    ETA  : string
}

Вот тип, который содержит ProfileImage:

[<DataContract>]
type Courier = {

    [<field: DataMember(Name="CourierId")>]
    CourierId    : string

    [<field: DataMember(Name="Name")>]
    Name         : string

    [<field: DataMember(Name="ProfileImage")>]
    ProfileImage : string

    [<field: DataMember(Name="LastLocation")>]
    LastLocation : Coordinate

    [<field: DataMember(Name="IsSubscribed")>]
    IsSubscribed : bool

    [<field: DataMember(Name="Timestamp")>]
    Timestamp    : DateTime
}

1 Ответ

2 голосов
/ 12 апреля 2020

Json. Net обрабатывает байтовые массивы, автоматически преобразовывая их в строки в кодировке Base-64 и обратно. Поэтому, если вы десериализуете JSON в класс со свойством, объявленным как byte[], но соответствующее строковое значение в JSON не закодировано в base-64, например "undefined_image", это вызовет ошибку Наблюдение.

Самое простое решение - изменить тип нарушающего свойства с byte[] на string. Однако, если у вас есть ситуация, когда JSON иногда будет содержать действительные строки base-64, а иногда нет, и вы захотите, чтобы это было byte[] для обработки данных для действительного случая, вам нужно будет создать custom JsonConverter для обработки этого свойства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...