Отклонение ответа API base64 вызывает исключение FormatException - PullRequest
0 голосов
/ 03 августа 2020

АНИ Я работаю над возвращает следующие Base64, UTF8 данных.

H4sIAAAAAAAEAIXS3WvCMBAA8H8l5MmB9Wtf2idtJ86HDrHKNsYeYntrgzUpl2RQpf / 7UsExsXZvCcf97ri7A0XQBsUT04y6BzoGRIlAXUrbFDIQkZx + g9D8GBR4 + tChjY8NZgvOtGZfEnc2n6Za58rtdk3EOwnoQhqEKqMjRcYFVGb1ldT9sByPf7l + xcWgIuR7LkXVwKDXH5G1PyfByiOvErOY + Cnb5TasUp4rskBQNh1isilIABiBBRwPxJ60Aik0CRm3YTIRAhx / 8nJDy / Z51duGqkvJ4tqyrXeJW / tEcGbe8hK9a0DXuGGiXvVTEElsHP + 5ptH7OnPQO5p + EWWS + CiVqpMvrIcr1vkEj4OXRmg7Q + LxLZxsk1 + Ijw3decEbCU1u7b8N1iDDBmSFLNr + fwMrrpTUpOUB2mtzZtOa7Ywaylxf + YQnGTgBQ80TUZBwPbfyZ1mWP1eCbD1AAwAA

Я написал следующий тест, чтобы преобразовать его в UTF8 Json строки.

void main() {
  const data = "H4sIAAAAAAAEAIXS3WvCMBAA8H8l5MmB9Wtf2idtJ86HDrHKNsYeYntrgzUpl2RQpf/7UsExsXZvCcf97ri7A0XQBsUT04y6BzoGRIlAXUrbFDIQkZx+g9D8GBR4+tChjY8NZgvOtGZfEnc2n6Za58rtdk3EOwnoQhqEKqMjRcYFVGb1ldT9sByPf7l+xcWgIuR7LkXVwKDXH5G1PyfByiOvErOY+Cnb5TasUp4rskBQNh1isilIABiBBRwPxJ60Aik0CRm3YTIRAhx/8nJDy/Z51duGqkvJ4tqyrXeJW/tEcGbe8hK9a0DXuGGiXvVTEElsHP+5ptH7OnPQO5p+EWWS+CiVqpMvrIcr1vkEj4OXRmg7Q+LxLZxsk1+Ijw3decEbCU1u7b8N1iDDBmSFLNr+fwMrrpTUpOUB2mtzZtOa7Ywaylxf+YQnGTgBQ80TUZBwPbfyZ1mWP1eCbD1AAwAA";
  
  test('Base64 decoder', () {
    final bytes = base64.decode(data);

    String jsonString;
    try {
      jsonString = utf8.decode(bytes);  
    } catch (e) {
      // ignore: avoid_print
      print(e);
    }
    
    // ignore: avoid_print
    print("$jsonString\n");

    final decoded = json.decode(jsonString);
    // ignore: avoid_print
    print("$decoded\n");
    expect(decoded, !null);
  });
}

байты, которые получают декодируются из base64 строка мне нравится, но когда я пытаюсь utf8.decode() байтов. Я получаю FormatException или, если я добавляю allowMalformed = true, бессмысленную строку.

Как правильно декодировать строку Json?

1 Ответ

3 голосов
/ 03 августа 2020

Ваш вход BASE64 представляет собой сжатую GZip JSON String. Будет работать следующая программа:

import 'dart:convert';
import 'dart:io';

void main() {
  const data = "H4sIAAAAAAAEAIXS3WvCMBAA8H8l5MmB9Wtf2idtJ86HDrHKNsYeYntrgzUpl2RQpf/7UsExsXZvCcf97ri7A0XQBsUT04y6BzoGRIlAXUrbFDIQkZx+g9D8GBR4+tChjY8NZgvOtGZfEnc2n6Za58rtdk3EOwnoQhqEKqMjRcYFVGb1ldT9sByPf7l+xcWgIuR7LkXVwKDXH5G1PyfByiOvErOY+Cnb5TasUp4rskBQNh1isilIABiBBRwPxJ60Aik0CRm3YTIRAhx/8nJDy/Z51duGqkvJ4tqyrXeJW/tEcGbe8hK9a0DXuGGiXvVTEElsHP+5ptH7OnPQO5p+EWWS+CiVqpMvrIcr1vkEj4OXRmg7Q+LxLZxsk1+Ijw3decEbCU1u7b8N1iDDBmSFLNr+fwMrrpTUpOUB2mtzZtOa7Ywaylxf+YQnGTgBQ80TUZBwPbfyZ1mWP1eCbD1AAwAA";

  final bytes = base64.decode(data);

  String jsonString;
  try {
    jsonString = utf8.decode(GZipCodec().decode(bytes));
  } catch (e) {
    // ignore: avoid_print
    print(e);
  }

  // ignore: avoid_print
  print("$jsonString\n");

  final dynamic decoded = json.decode(jsonString);
  // ignore: avoid_print
  print("$decoded\n");
}

Возвращает:

{"returnData":{"@errore":"","elencoEventi":{"@nrEventi":"8","@urlPiattaforma":"https://uci.getyourevent.online","evento":[{"@idEventi":"1","@descrizione":"2019 UCI MTB World Championships Presented by Mercedes-Benz (Mont Sainte Anne-CAN)"},{"@idEventi":"3","@descrizione":"2019 UCI Road World Championships (Yorkshire-GBR)"},{"@idEventi":"4","@descrizione":"2019 UCI Urban World Championships (Chengdu-CHN)"},{"@idEventi":"5","@descrizione":"2020 UCI Cyclo Cross World Championships"},{"@idEventi":"6","@descrizione":"2020 Mercedes-Benz UCI Mountain Bike World Cup"},{"@idEventi":"7","@descrizione":"2020 UCI BMX Supercross World Cup"},{"@idEventi":"8","@descrizione":"2020 UCI Track World Championships Presented by Tissot (Berlin-GER)"},{"@idEventi":"9","@descrizione":"2020 UCI Road World Championships (Aigle-Martigny SUI)"}]}}}

{returnData: {@errore: , elencoEventi: {@nrEventi: 8, @urlPiattaforma: https://uci.getyourevent.online, evento: [{@idEventi: 1, @descrizione: 2019 UCI MTB World Championships Presented by Mercedes-Benz (Mont Sainte Anne-CAN)}, {@idEventi: 3, @descrizione: 2019 UCI Road World Championships (Yorkshire-GBR)}, {@idEventi: 4, @descrizione: 2019 UCI Urban World Championships (Chengdu-CHN)}, {@idEventi: 5, @descrizione: 2020 UCI Cyclo Cross World Championships}, {@idEventi: 6, @descrizione: 2020 Mercedes-Benz UCI Mountain Bike World Cup}, {@idEventi: 7, @descrizione: 2020 UCI BMX Supercross World Cup}, {@idEventi: 8, @descrizione: 2020 UCI Track World Championships Presented by Tissot (Berlin-GER)}, {@idEventi: 9, @descrizione: 2020 UCI Road World Championships (Aigle-Martigny SUI)}]}}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...