Iman H
Iman H

Reputation: 476

Encoding to a standard, colon-seperated json in dart/flutter and built_value

In my flutter project, I want to use built_value for json serialization. One of the sample classes is:

import 'dart:convert';

import 'package:built_value/built_value.dart';
import 'package:built_value/serializer.dart';

part 'device.model.g.dart';

abstract class Device implements Resource, Built<Device, DeviceBuilder> {
  // Fields

  String get name;
  String get code;
  bool get isActive;

  Device._();

  factory Device([void Function(DeviceBuilder) updates]) = _$Device;

  String toJson() {
    return json.encode(serializers.serializeWith(Device.serializer, this));
  }

  factory Device.fromJson(String jsonString) {
    return serializers.deserializeWith(
        Device.serializer, json.decode(jsonString))!;
  }

  static Serializer<Device> get serializer => _$deviceSerializer;
}

I used the build_runner to generate the codes and everything is OK.

Also I have defined the serializers:

part 'serializers.g.dart';

final standardSerializers =
    (serializers.toBuilder()..addPlugin(StandardJsonPlugin())).build();

@SerializersFor([
Device])
final Serializers serializers = _$serializers;

Now I want to use the toJson() method:

  final device = Device((d) => d
    ..code = "DEV11"
    ..name = "Some Tools"
    ..isActive = true);

  print(device.toJson());

The output is:

["name","Some Tools","code","DEV11","isActive",true]

which is a List of objects, instead of Map<String, dynamic>. The generated serializer is:

Iterable<Object?> serialize(Serializers serializers, Device object,
      {FullType specifiedType = FullType.unspecified})
      ...

which returns an Iterable of Object?.

How can I make built_value to generate a json with the standard format, i.e:

{"name":"Some Tools","code":"DEV11","isActive":true};

P.S: using the dart encoder,

print(json.encode(device));

results in:

"[\"name\",\"Some Tools\",\"code\",\"DEV11\",\"isActive\",true]"

Upvotes: 1

Views: 123

Answers (1)

Iman H
Iman H

Reputation: 476

I made a silly mistake. Should be:

@SerializersFor([
  Device,
])
final Serializers serializers =
    (_$serializers.toBuilder()..addPlugin(StandardJsonPlugin())).build();

Upvotes: 1

Related Questions