google / google/built_value.dart

serialize and deserialize fails for Enum Map

Open
#494 10 comments 8 reactions 1 assignee Claimed by @davidmorgan View on GitHub
p2 / bug
Dominant language
Dart
Stars
886
Forks
195
Avg merge
1d 11h
Merged PRs (30d)
4

Description

I have a variableof type BuiltMap in my model. serialize and deserialize of this model to json is failing

for this variable in json the library is expecting the key to surround two quotes.

on serialization of sample model. i get this **`{"basic":1.0,"allowances":{"\"MEDICAL_REIMBURSEMENT\"":2.0}}`** as output which is invalid json. and also deserialization fails unless i give two quotes

Sample model
```dart
abstract class Salary implements Built {
static Serializer get serializer => _$salarySerializer;

@nullable
double get basic;

@nullable
BuiltMap get allowances;

Salary._();

factory Salary([updates(SalaryBuilder b)]) = _$Salary;

Salary rebuild(void updates(SalaryBuilder b));
SalaryBuilder toBuilder();
}

Salary parseSalary(String jsonStr){
final parsed = json.decode(jsonStr);
Salary salary = standardSerializers.deserializeWith(Salary.serializer, parsed);
return salary;
}

String toJson(Salary salary){
var serializedMap = standardSerializers.serializeWith(Salary.serializer, salary);
return jsonEncode(serializedMap);
}

@BuiltValueEnum(wireName: 'Allowance')
class Allowance extends EnumClass {
static Serializer get serializer => _$allowanceSerializer;

@BuiltValueEnumConst(wireName: 'MEDICAL_REIMBURSEMENT')
static const Allowance MEDICAL_REIMBURSEMENT = _$MEDICAL_REIMBURSEMENT;
@BuiltValueEnumConst(wireName: 'FIXED_MEDICAL_ALLOWANCE')
static const Allowance FIXED_MEDICAL_ALLOWANCE = _$FIXED_MEDICAL_ALLOWANCE;
@BuiltValueEnumConst(wireName: 'CHILD_EDUCATION')
static const Allowance CHILD_EDUCATION = _$CHILD_EDUCATION;
@BuiltValueEnumConst(wireName: 'CHILD_HOTEL_FEE')
static const Allowance CHILD_HOTEL_FEE = _$CHILD_HOTEL_FEE;
@BuiltValueEnumConst(wireName: 'ENTERTAINMENT')
static const Allowance ENTERTAINMENT = _$ENTERTAINMENT;
@BuiltValueEnumConst(wireName: 'LTA')
static const Allowance LTA = _$LTA;
@BuiltValueEnumConst(wireName: 'UNIFORM')
static const Allowance UNIFORM = _$UNIFORM;
@BuiltValueEnumConst(wireName: 'FUEL')
static const Allowance FUEL = _$FUEL;
@BuiltValueEnumConst(wireName: 'TELEPHONE')
static const Allowance TELEPHONE = _$TELEPHONE;
@BuiltValueEnumConst(wireName: 'OTHERS')
static const Allowance OTHERS = _$OTHERS;

const Allowance._(String name) : super(name);

static BuiltSet get values => _$vls;
static Allowance valueOf(String name) => _$vlOf(name);
}
```
```dart
@SerializersFor(const [
Salary,
Allowance,
])
Serializers serializers = _$serializers;

Serializers standardSerializers =
(serializers.toBuilder()..addPlugin(new StandardJsonPlugin())).build();
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.