簡體   English   中英

解析嵌套 JSON 會導致 fromJson 方法具有“類 'Data' 沒有未命名的構造函數”。 錯誤

[英]Parsing Nested JSON leads to fromJson methods having a "The class 'Data' doesn't have an unnamed constructor." error

因此,我試圖從 VirusTotal 的 GET 請求中解析嵌套 JSON,但是當我創建方法來解析我正在尋找的 JSON 時,它在 => 之后立即給我一個工廠方法錯誤。 我使用工具https://app.quicktype.io/來獲取此方法,但它似乎仍然不起作用。 我要解析的 JSON 看起來像這樣,代碼在下面。

{
  "data": {
    "attributes": {
      "last_analysis_stats": {
        "harmless": 81,
        "malicious": 2,
        "suspicious": 0
      }
    }
  }
}

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:sms/sms.dart';
import 'package:http/http.dart' as http;

Future<void> main() async {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key:key);
  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: "Gone Smishin'",
      home:  GoneSmishin(),
    );
  }
}

class GoneSmishin extends StatefulWidget {
  const GoneSmishin({Key? key}) : super(key: key);
  State<GoneSmishin> createState() {
    return _GoneSmishinState();
  }
}

class Data {
  late Attributes attributes;

  factory Data.fromJson(Map<String, dynamic> json) => Data( // this is where the error appears in every method
    attributes: Attributes.fromJson(json["attributes"]),
  );

  Map<String, dynamic> toJson() => {
    "attributes": attributes.toJson(),
  };
}

class Attributes {
  late LastAnalysisStats lastAnalysisStats;

  factory Attributes.fromJson(Map<String, dynamic> json) => Attributes(
    lastAnalysisStats: LastAnalysisStats.fromJson(json["last_analysis_stats"]),
  );

  Map<String, dynamic> toJson() => {
    "last_analysis_stats": lastAnalysisStats.toJson(),
  };
}

class LastAnalysisStats {
  static late int harmless;
  static late int malicious;
  static late int suspicious;

  factory LastAnalysisStats.fromJson(Map<String, dynamic> json) => LastAnalysisStats(
    harmless: json["harmless"],
    malicious: json["malicious"],
    suspicious: json["suspicious"],
  );

  Map<String, dynamic> toJson() => {
    //"harmless": harmless,
    "malicious": malicious,
    "suspicious": suspicious,
  };
}


class _GoneSmishinState extends State<GoneSmishin> {

  late Data data;

  String message = "";
  String word = "";
  bool isOn = false;

  final myController = TextEditingController();

  @override
  void dispose() {
    myController.dispose();
    super.dispose();
  }

  var queryStatus = '';
  var urlStatus = '';
  var attributes = '';

  String urlHaus = "URLHaus";
  String virusTotal = "VirusTotal";
  String list = "Whitelist";


  urlHausParseBox() async {
    String url = myController.text;
    var urlEncoded = base64.encode(utf8.encode(myController.text));
    var urlNoPadding = urlEncoded.replaceAll(new RegExp(r'='), '');
    
    // await VirusTotal().getUrlAnalysisReport(urlNoPadding);

    final response2 = await http.get(
      Uri.parse("https://www.virustotal.com/api/v3/urls/$urlNoPadding"),
      headers: <String, String>{
        'Accept': 'application/json',
        'x-apikey': '111111111111111111111'
      },
    );

    print(urlEncoded);
    print(response2.body);
    
    if (response2.statusCode == 200) {
      setState(() {
        final decoded = json.decode(response2.body);
        data = decoded['data'];
      });
    }

if (queryStatus == "ok" && urlStatus == "online") {
      print("found");
      setState(() {
        urlHaus = 'Found in URLHause Database - Probably Smishing';
      });
    } else if (queryStatus == "ok" && urlStatus == "offline") {
      print("found offline");
      setState(() {
        urlHaus = 'Found in URLHaus, not online';
      });
    } else {
      print("not found");
      setState(() {
        urlHaus = 'Found Nothing';
      });
    }
    if (((LastAnalysisStats.suspicious) + (LastAnalysisStats.malicious)) >= 2) {
      setState(() {
        virusTotal = 'Found in VirusTotal - Possibly Malicious';
      });
    } else
    if (((LastAnalysisStats.suspicious) + (LastAnalysisStats.malicious)) <= 1) {
      setState(() {
        virusTotal = 'Found in VirusTotal - Probably not Malicious';
        print((LastAnalysisStats.suspicious) + (LastAnalysisStats.malicious));
      });
    } else {
      setState(() {
        virusTotal = 'Not found in VirusTotal';
      });
    }

你能嘗試像這樣使用json模型嗎?

import 'dart:convert';

Model modelFromJson(String str) => Model.fromJson(json.decode(str));

String modelToJson(Model data) => json.encode(data.toJson());

class Model {
    Model({
        this.data,
    });

    Data data;

    factory Model.fromJson(Map<String, dynamic> json) => Model(
        data: Data.fromJson(json["data"]),
    );

    Map<String, dynamic> toJson() => {
        "data": data.toJson(),
    };
}

class Data {
    Data({
        this.attributes,
    });

    Attributes attributes;

    factory Data.fromJson(Map<String, dynamic> json) => Data(
        attributes: Attributes.fromJson(json["attributes"]),
    );

    Map<String, dynamic> toJson() => {
        "attributes": attributes.toJson(),
    };
}

class Attributes {
    Attributes({
        this.lastAnalysisStats,
    });

    LastAnalysisStats lastAnalysisStats;

    factory Attributes.fromJson(Map<String, dynamic> json) => Attributes(
        lastAnalysisStats: LastAnalysisStats.fromJson(json["last_analysis_stats"]),
    );

    Map<String, dynamic> toJson() => {
        "last_analysis_stats": lastAnalysisStats.toJson(),
    };
}

class LastAnalysisStats {
    LastAnalysisStats({
        this.harmless,
        this.malicious,
        this.suspicious,
    });

    int harmless;
    int malicious;
    int suspicious;

    factory LastAnalysisStats.fromJson(Map<String, dynamic> json) => LastAnalysisStats(
        harmless: json["harmless"],
        malicious: json["malicious"],
        suspicious: json["suspicious"],
    );

    Map<String, dynamic> toJson() => {
        "harmless": harmless,
        "malicious": malicious,
        "suspicious": suspicious,
    };
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM