[Flutter] Json to Dart Model Class

이상우·2022년 10월 9일
0
post-thumbnail

[Json 예시]

{
    "status": "success",
    "data": {
        "city": "Yongsan-dong",
        "state": "Seoul",
        "country": "South Korea",
        "location": {
            "type": "Point",
            "coordinates": [
                126.990597,
                37.532171
            ]
        },
        "current": {
            "pollution": {
                "ts": "2022-10-09T08:00:00.000Z",
                "aqius": 17,
                "mainus": "p2",
                "aqicn": 17,
                "maincn": "n2"
            },
            "weather": {
                "ts": "2022-10-09T08:00:00.000Z",
                "tp": 12,
                "pr": 1015,
                "hu": 89,
                "ws": 2.57,
                "wd": 135,
                "ic": "10d"
            }
        }
    }
}

[방법1. Json to Dart 사이트 사용하기]
https://javiercbk.github.io/json_to_dart/

  • 왼쪽에 Json 을 넣으면
  • 오른쪽에 자동으로 Json 을 모델화 한 Class.dart 파일을 생성해준다.
  • 이것을 그대로 모두 복사해서 사용하면 됨 개꿀임.

[방법2. Android Studio 의 JsonToDart (Json To Dart)]
- 안드로이드 스튜디오의 Plugin 중 JsonToDart를 다운로드

  • 새로운 다트 파일 만들기 들어가서 Json To Dart를 선택
  • Json 입력하고 생성할 클래스명 입력하면 자동으로 모델 생성해줌 개꿀임

[방법3. json_serializable 라이브러리 사용]

   이런식으로 패키지 다운 받으셈

[방법3. json_serializable 라이브러리 사용 자세히 보기]

  • 이 방법은 어느정도 내가 코드를 짜야함 거의 다 짜야한다고 보면 됨.
import 'package:json_annotation/json_annotation.dart';

part 'AirResult2.g.dart'; //이거는 스크립트명임 스크립트당 1줄만 쓰는거임 클래스 수대로 쓰는거 아님

@JsonSerializable() // 이거 꼭 붙히삼
class AirResult2 {
final String? status;
final Data? data;

AirResult2(this.status, this.data);

factory AirResult2.fromJson(Map<String, dynamic> json) =>
   _$AirResult2FromJson(json);

Map<String, dynamic> toJson() => _$AirResult2ToJson(this);
}
  • 이거는 클래스 하나로 표현할 수 있는 완전 간단한 Json 일때의 형식이다.

  • 하기는 맨 위의 Json 파일에 해당하는 모델 클래스 보여줌.

    import 'package:json_annotation/json_annotation.dart';
    
    part 'AirResult2.g.dart';
    
    @JsonSerializable()
    class AirResult2 {
    final String? status;
    final Data? data;
    
    AirResult2(this.status, this.data);
    
    factory AirResult2.fromJson(Map<String, dynamic> json) =>
       _$AirResult2FromJson(json);
    
    Map<String, dynamic> toJson() => _$AirResult2ToJson(this);
    }
    
    @JsonSerializable()
    class Data {
    final String? city;
    final String? state;
    final String? country;
    final Location? location;
    final Current? current;
    
    Data(this.city, this.state, this.country, this.location, this.current);
    
    factory Data.fromJson(Map<String, dynamic> json) => _$DataFromJson(json);
    
    Map<String, dynamic> toJson() => _$DataToJson(this);
    }
    
    @JsonSerializable()
    class Location {
    final String? type;
    final List<double>? coordinates;
    
    Location(this.type, this.coordinates);
    
    factory Location.fromJson(Map<String, dynamic> json) =>
       _$LocationFromJson(json);
    
    Map<String, dynamic> toJson() => _$LocationToJson(this);
    }
    
    @JsonSerializable()
    class Current {
    final Pollution? pollution;
    final Weather? weather;
    
    Current(this.pollution, this.weather);
    
    factory Current.fromJson(Map<String, dynamic> json) =>
       _$CurrentFromJson(json);
    
    Map<String, dynamic> toJson() => _$CurrentToJson(this);
    }
    
    @JsonSerializable()
    class Pollution {
    final String? ts;
    final int? aqius;
    final String? mainus;
    final int? aqicn;
    final String? maincn;
    
    Pollution(this.ts, this.aqius, this.mainus, this.aqicn, this.maincn);
    
    factory Pollution.fromJson(Map<String, dynamic> json) =>
       _$PollutionFromJson(json);
    
    Map<String, dynamic> toJson() => _$PollutionToJson(this);
    }
    
    @JsonSerializable()
    class Weather {
    final String? ts;
    final int? tp;
    final int? pr;
    final int? hu;
    final double? ws;
    final int? wd;
    final String? ic;
    
    Weather(this.ts, this.tp, this.pr, this.hu, this.ws, this.wd, this.ic);
    
    factory Weather.fromJson(Map<String, dynamic> json) =>
       _$WeatherFromJson(json);
    
    Map<String, dynamic> toJson() => _$WeatherToJson(this);
    }
   
   
   
- ㅇㅋ??? 이렇게 짜셈 복사해서 쓰셈 ㅇㅋ??
   
   
   이거 짠 다음에
   
   터미널에
   
   
flutter pub run build_runner build 
   
   
   - 실행하셈
   
   - 그러면 진짜 Json to dart 모델 클래스 생성해줌 ㅇㅋ?? 
   
   
   
   
   // GENERATED CODE - DO NOT MODIFY BY HAND

part of 'AirResult2.dart';

// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************

AirResult2 _$AirResult2FromJson(Map<String, dynamic> json) => AirResult2(
      json['status'] as String?,
      json['data'] == null
          ? null
          : Data.fromJson(json['data'] as Map<String, dynamic>),
    );

Map<String, dynamic> _$AirResult2ToJson(AirResult2 instance) =>
    <String, dynamic>{
      'status': instance.status,
      'data': instance.data,
    };

Data _$DataFromJson(Map<String, dynamic> json) => Data(
      json['city'] as String?,
      json['state'] as String?,
      json['country'] as String?,
      json['location'] == null
          ? null
          : Location.fromJson(json['location'] as Map<String, dynamic>),
      json['current'] == null
          ? null
          : Current.fromJson(json['current'] as Map<String, dynamic>),
    );

Map<String, dynamic> _$DataToJson(Data instance) => <String, dynamic>{
      'city': instance.city,
      'state': instance.state,
      'country': instance.country,
      'location': instance.location,
      'current': instance.current,
    };

Location _$LocationFromJson(Map<String, dynamic> json) => Location(
      json['type'] as String?,
      (json['coordinates'] as List<dynamic>?)
          ?.map((e) => (e as num).toDouble())
          .toList(),
    );

Map<String, dynamic> _$LocationToJson(Location instance) => <String, dynamic>{
      'type': instance.type,
      'coordinates': instance.coordinates,
    };

Current _$CurrentFromJson(Map<String, dynamic> json) => Current(
      json['pollution'] == null
          ? null
          : Pollution.fromJson(json['pollution'] as Map<String, dynamic>),
      json['weather'] == null
          ? null
          : Weather.fromJson(json['weather'] as Map<String, dynamic>),
    );

Map<String, dynamic> _$CurrentToJson(Current instance) => <String, dynamic>{
      'pollution': instance.pollution,
      'weather': instance.weather,
    };

Pollution _$PollutionFromJson(Map<String, dynamic> json) => Pollution(
      json['ts'] as String?,
      json['aqius'] as int?,
      json['mainus'] as String?,
      json['aqicn'] as int?,
      json['maincn'] as String?,
    );

Map<String, dynamic> _$PollutionToJson(Pollution instance) => <String, dynamic>{
      'ts': instance.ts,
      'aqius': instance.aqius,
      'mainus': instance.mainus,
      'aqicn': instance.aqicn,
      'maincn': instance.maincn,
    };

Weather _$WeatherFromJson(Map<String, dynamic> json) => Weather(
      json['ts'] as String?,
      json['tp'] as int?,
      json['pr'] as int?,
      json['hu'] as int?,
      (json['ws'] as num?)?.toDouble(),
      json['wd'] as int?,
      json['ic'] as String?,
    );

Map<String, dynamic> _$WeatherToJson(Weather instance) => <String, dynamic>{
      'ts': instance.ts,
      'tp': instance.tp,
      'pr': instance.pr,
      'hu': instance.hu,
      'ws': instance.ws,
      'wd': instance.wd,
      'ic': instance.ic,
    };

      
      
      
      - 어디서 많이 본 코드일 것이다. 이거 위의 방법1 , 방법2 에서 한방에 생성해준 코드임ㅋㅋㅋㅋㅋ
      근데 왜 라이브러리 쓰는거임? 사이트랑 플러그인으로 한방에 모델 클래스 생성하고 말지ㅋㅋㅋ
      
      맞는 말이긴 한데 이건 어느정도 사용자화 커스텀이 가능하더라 ㅋㅋ
      솔직히 맘에 드는거 쓰셈 ㅇㅋ?? 
      
      
   
   
   

profile
Flutter App Developer

0개의 댓글

관련 채용 정보