Skip to content

Commit 7b2d4dc

Browse files
committed
add null safety
1 parent 02ed44a commit 7b2d4dc

File tree

7 files changed

+50
-35
lines changed

7 files changed

+50
-35
lines changed

CHANGELOG.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
## 1.0.0
22
* init project, This library generates a model object corresponding to a JSON string by executing commands in code
33
## 1.0.1
4-
* update LICENSE
4+
* update LICENSE
5+
## 1.0.2
6+
* Null safety is supported

example/lib/models/json/test.dart

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,17 @@ class Test {
77
this.aListOfInts,
88
this.list1
99
});
10-
final List<int> aListOfInts;
11-
final List1 list1;
10+
final List<int>? aListOfInts;
11+
final List1? list1;
1212

1313
factory Test.fromJson(Map<String, dynamic> json) => Test(
1414
aListOfInts: json['aListOfInts'] == null ? null : List<int>.from(json['aListOfInts'].map((x) => x)),
1515
list1: json['list1'] == null ? null : List1.fromJson(json['list1'])
1616
);
1717

1818
Map<String, dynamic> toJson() => {
19-
'aListOfInts': aListOfInts == null ? null : List<dynamic>.from(aListOfInts.map((x) => x)),
20-
'list1': list1 == null ? null : list1.toJson()
19+
'aListOfInts': aListOfInts == null ? null : List<dynamic>.from(aListOfInts!.map((x) => x)),
20+
'list1': list1 == null ? null : list1?.toJson()
2121
};
2222

2323
}
@@ -29,8 +29,8 @@ class List1 {
2929
this.list3,
3030
this.list4
3131
});
32-
final List<bool> list2;
33-
final List<dynamic> list3;
32+
final List<bool>? list2;
33+
final List<dynamic>? list3;
3434
final dynamic list4;
3535

3636
factory List1.fromJson(Map<String, dynamic> json) => List1(
@@ -40,8 +40,8 @@ class List1 {
4040
);
4141

4242
Map<String, dynamic> toJson() => {
43-
'list2': list2 == null ? null : List<dynamic>.from(list2.map((x) => x)),
44-
'list3': list3 == null ? null : List<dynamic>.from(list3.map((x) => x)),
43+
'list2': list2 == null ? null : List<dynamic>.from(list2!.map((x) => x)),
44+
'list3': list3 == null ? null : List<dynamic>.from(list3!.map((x) => x)),
4545
'list4': list4
4646
};
4747

example/lib/models/json/testarray.dart

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@ class Testarray {
1111
this.format,
1212
this.url
1313
});
14-
final String md5;
15-
final String height;
16-
final String width;
17-
final String type;
18-
final List<Format> format;
19-
final String url;
14+
final String? md5;
15+
final String? height;
16+
final String? width;
17+
final String? type;
18+
final List<Format>? format;
19+
final String? url;
2020

2121
factory Testarray.fromJson(Map<String, dynamic> json) => Testarray(
2222
md5: json['md5'],
@@ -32,7 +32,7 @@ class Testarray {
3232
'height': height,
3333
'width': width,
3434
'type': type,
35-
'format': format == null ? null : List<dynamic>.from(format.map((x) => x.toJson())),
35+
'format': format == null ? null : List<dynamic>.from(format!.map((x) => x.toJson())),
3636
'url': url
3737
};
3838

@@ -44,8 +44,8 @@ class Format {
4444
this.type,
4545
this.name
4646
});
47-
final String type;
48-
final String name;
47+
final String? type;
48+
final String? name;
4949

5050
factory Format.fromJson(Map<String, dynamic> json) => Format(
5151
type: json['type'],

lib/src/create_dart_class.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,15 @@ Map<String, dynamic> toJson() => {
4444
case "bool":
4545
case "String":
4646
case "dynamic":
47-
v = "${e.key} == null ? null : List<dynamic>.from(${e.key}.map((x) => x))";
47+
v = "${e.key} == null ? null : List<dynamic>.from(${e.key}!.map((x) => x))";
4848
break;
4949
default:
50-
v = "${e.key} == null ? null : List<dynamic>.from(${e.key}.map((x) => x.toJson()))";
50+
v = "${e.key} == null ? null : List<dynamic>.from(${e.key}!.map((x) => x.toJson()))";
5151
break;
5252
}
5353
break;
5454
case Type.OBJECT:
55-
v = "${e.key} == null ? null : ${e.key}.toJson()";
55+
v = "${e.key} == null ? null : ${e.key}?.toJson()";
5656
break;
5757
case Type.COMMON:
5858
default:
@@ -64,7 +64,7 @@ Map<String, dynamic> toJson() => {
6464
};
6565
""";
6666

67-
String createDartClass({String import, String decoder, String className, String attrs, List<DartType> fieldNames}) {
67+
String createDartClass({String import = "", String decoder = "", String className = "", String attrs = "", List<DartType> fieldNames = const []}) {
6868
var classOut = """
6969
$import
7070
$decoder

lib/src/internal.dart

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,22 @@ String genClassName(String name) {
1818
}
1919

2020
/// filter special character, capitalize the first letter
21-
String _filterName(String name) => name
22-
?.split(RegExp(r'\W'))
23-
?.where((element) => element.isNotEmpty)
24-
?.map((it) => '${it[0].toUpperCase()}${it.substring(1)}')
25-
?.join();
21+
String _filterName(String name) =>
22+
name
23+
.split(RegExp(r'\W'))
24+
.where((element) => element.isNotEmpty)
25+
.map((it) => '${it[0].toUpperCase()}${it.substring(1)}')
26+
.join();
2627

2728
// ignore: camel_case_extensions
2829
extension letterCase on String {
2930
// Lowercase first letter
30-
String lowerLetterCase() => length == 1 ? toLowerCase() : this[0].toLowerCase() + substring(1);
31+
String lowerLetterCase() =>
32+
length == 1 ? toLowerCase() : this[0].toLowerCase() + substring(1);
3133

3234
// Uppercase first letter
33-
String upperLetterCase() => length == 1 ? toUpperCase() : this[0].toUpperCase() + substring(1);
35+
String upperLetterCase() =>
36+
length == 1 ? toUpperCase() : this[0].toUpperCase() + substring(1);
3437
}
3538

3639
const KEYWORDS = [
@@ -139,4 +142,8 @@ String toType(dynamic data) {
139142
}
140143

141144
bool isPrimitive(String type) =>
142-
type == 'int' || type == 'double' || type == 'bool' || type == 'String' || type == 'dynamic';
145+
type == 'int' ||
146+
type == 'double' ||
147+
type == 'bool' ||
148+
type == 'String' ||
149+
type == 'dynamic';

lib/src/json_parse.dart

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,11 @@ void _parseObject(String name, Map result, Type type, Args param, {List array =
3838
result.forEach((key, value) {
3939
var type = createType(key, value, name, param.names);
4040
fieldNames.add(type);
41-
attrs.write('${''.padLeft(2)}${'final ${type.name} $key;\n'}');
41+
if (type.name == "dynamic") {
42+
attrs.write('${''.padLeft(2)}${'final ${type.name} $key;\n'}');
43+
} else {
44+
attrs.write('${''.padLeft(2)}${'final ${type.name}? $key;\n'}');
45+
}
4246
});
4347
var import = '';
4448
var decoder = '';
@@ -77,8 +81,10 @@ void _parseObject(String name, Map result, Type type, Args param, {List array =
7781
fieldNames.where((element) => element.type != Type.COMMON).forEach((element) {
7882
if (!isPrimitive(element.className)) {
7983
var className = upperCamelCase(element.key, name, param.names);
80-
_parseJson(className, element.value, param);
81-
param.names.add(className);
84+
if (className != null) {
85+
_parseJson(className, element.value, param);
86+
param.names.add(className);
87+
}
8288
}
8389
});
8490
}

pubspec.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
name: json2model
22
description: This library generates a model object corresponding to a JSON string by executing commands in code.
3-
version: 1.0.1
3+
version: 1.0.2
44
homepage: https://github.com/venshine/json2model
55

66
environment:
7-
sdk: '>=2.10.0 <3.0.0'
7+
sdk: '>=2.12.0 <3.0.0'
88

99
dependencies:
1010
args: ^2.3.1

0 commit comments

Comments
 (0)