Saya memiliki file dart sederhana yang saya jalankan:

import 'dart:convert';

// ...

dynamic test() {
  final strJson = '{"ACB":["{\"date\":\"2020-02-28\",\"open\":1.36,\"close\":1.34,\"high\":1.4,\"low\":1.32,\"volume\":26469238}","{\"date\":\"2020-03-12\",\"open\":47.99,\"close\":45.54,\"high\":50.09,\"low\":45.37,\"volume\":50661745}"]}';
  final parsedJson = json.decode(strJson);
  print('${parsedJson.runtimeType} : $parsedJson');
}

main() {
  test();
}

Tetapi mendapatkan pengecualian aneh ini:

Unhandled exception:
FormatException: Unexpected character (at character 12)
{"ACB":["{"date":"2020-02-28","open":1.36,"close":1.34,"high":1.4,"low":1.3...
           ^

#0      _ChunkedJsonParser.fail (dart:convert-patch/convert_patch.dart:1394:5)
#1      _ChunkedJsonParser.parse (dart:convert-patch/convert_patch.dart:924:48)
#2      _parseJson (dart:convert-patch/convert_patch.dart:31:10)
#3      JsonDecoder.convert (dart:convert/json.dart:495:36)
#4      JsonCodec.decode (dart:convert/json.dart:153:41)
#5      test (file:///home/val/src/labs/maingain/test.dart:60:27)
#6      main (file:///home/val/src/labs/maingain/test.dart:65:3)
#7      _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:307:19)
#8      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:174:12)

Saya hanya akan mengatakan, bahwa menjalankan kode serupa dari Flutter tampaknya berfungsi dengan baik. Hanya ketika menjalankan ini dari baris perintah beri saya yang di atas.

Juga divalidasi JSON.

0
valk 15 Maret 2020, 21:30

1 menjawab

Jawaban Terbaik

Letakkan r di depan literal string.

'{"ACB":["{\"date\":....' adalah literal string Dart dengan tanda kutip tunggal. Itu berarti backslash adalah pelarian string, jadi \" hanya menambahkan " ke nilai string. Ini bukan pelarian perlu karena string menggunakan tanda kutip tunggal, tetapi masih diperlakukan seperti pelarian.

Itu berarti Anda meneruskan konten string {"ACB":["{"date":... ke dekoder JSON, yang segera menyerah karena kode tersebut bukan JSON yang valid.

Jika Anda meletakkan r di depan string: r'{"ACB":["{\"date\":...' maka literal string menjadi string mentah. Itu berarti bahwa garis miring terbalik tidak berfungsi sebagai pelarian, tetapi diperlakukan seperti karakter literal. Itu membuat string yang dihasilkan JSON valid.

Alternatif lain adalah mengubah setiap garis miring terbalik menjadi dua: '{"ACB":["{\\"date\\":...'.

1
lrn 15 Maret 2020, 22:25