Home > Software engineering >  Error: Expected a value of type 'Sector?', but got one of type '_JsonMap'
Error: Expected a value of type 'Sector?', but got one of type '_JsonMap'

Time:01-24

I wanted to fatch data from local Json File and display into the terminal using Print() function but got an error message Error: Expected a value of type 'Sector?', but got one of type '_JsonMap'

Project Dart version: sdk: ">=2.16.0-134.1.beta <3.0.0"

Error

Error: Expected a value of type 'Sector?', but got one of type '_JsonMap'
    at Object.throw_ [as throw] (http://localhost:56217/dart_sdk.js:5067:11)
    at Object.castError (http://localhost:56217/dart_sdk.js:5026:15)
    at Object.cast [as as] (http://localhost:56217/dart_sdk.js:5351:17)
    at dart.NullableType.new.as (http://localhost:56217/dart_sdk.js:6911:60)
    at Function.fromJson (http://localhost:56217/packages/startupbits/model/DataModel.dart.lib.js:35:65)
    at demo._DemoScreenState.new.readJson (http://localhost:56217/packages/startupbits/screen/demo.dart.lib.js:102:46)
    at readJson.next (<anonymous>)
    at http://localhost:56217/dart_sdk.js:40568:33
    at _RootZone.runUnary (http://localhost:56217/dart_sdk.js:40438:59)
    at _FutureListener.thenAwait.handleValue (http://localhost:56217/dart_sdk.js:35360:29)
    at handleValueCallback (http://localhost:56217/dart_sdk.js:35928:49)
    at Function._propagateToListeners (http://localhost:56217/dart_sdk.js:35966:17)
    at async._AsyncCallbackEntry.new.callback (http://localhost:56217/dart_sdk.js:35695:27)
    at Object._microtaskLoop (http://localhost:56217/dart_sdk.js:40705:13)
    at _startMicrotaskLoop (http://localhost:56217/dart_sdk.js:40711:13)
    at http://localhost:56217/dart_sdk.js:36188:9

Json File

{
   "Sector": {
   "Food & Beverages": [
      {
         "Id": 1,
         "Companies": "Nutrizoe",
      }
      {
         "Id": 2,
         "Companies": "Third Wave Coffee",
      }
   ]
   }
}

DataModel.dart File

class StartupData{
  Sector? sector;

  StartupData({this.sector});

  factory StartupData.fromJson(Map<String, dynamic> json){
    return new StartupData(
      sector: json['Sector']
    );
  }
}

class Sector{
  List<FoodBeverages>? foodBeverages;

  Sector({this.foodBeverages});

  factory Sector.formJson(Map<String, dynamic> json){
    var list = json['Food & Beverages'] as List;
    List<FoodBeverages> foodList = list.map((i) => FoodBeverages.formJson(i)).toList();
    return new Sector(
      foodBeverages: foodList
    );
  }
}

class FoodBeverages{
  String? id;
  String? Companies;

  FoodBeverages({this.id,this.Companies});

  factory FoodBeverages.formJson(Map<String, dynamic> json){
    return new FoodBeverages(
      id: json['Id'].toString(),
      Companies: json['Companies']
    );
  }
}

Display.dart

where I want to print data in print()

import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:startupbits/model/DataModel.dart';

class DemoScreen extends StatefulWidget {
  const DemoScreen({Key? key}) : super(key: key);

  @override
  _DemoScreenState createState() => _DemoScreenState();
}

class _DemoScreenState extends State<DemoScreen> {
  late StartupData data;

  Future<String> loadJson() async{
    return await rootBundle.loadString('assets/StartUpData.json');
  }

  Future readJson() async{
    String jsonString = await loadJson();
    final response = await json.decode(jsonString);
    StartupData jsonData = new StartupData.fromJson(response);
    StartupData ob = new StartupData();
    print(ob.sector?.foodBeverages![0].id);   //============Print Value in Terminal============//
    setState(() {
      data = jsonData;
    });
  }

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    readJson();
  }

  @override
  Widget build(BuildContext context) {
    return Center(child: Text("Hello"),);
  }
}

CodePudding user response:

you should use the below code to identify sector in StartupData.fromJson :

class StartupData{
 Sector? sector;

  StartupData({this.sector});

   factory StartupData.fromJson(Map<String, dynamic> json){
      return new StartupData(
         sector: Sector.fromJson(json['Sector'] as Map<String, dynamic>),
   );
 }
}
  •  Tags:  
  • Related