In an API project, I'm consolidating data from separate external sources. One of these sources returns data in JSON format.
{
"agency": "SomeAgency",
"agencyData": {
"brandColor": "#A70000",
"cityName": "",
"countryCode": "BE",
"email": "",
"iataCode": "12345678",
"imageUrl": "",
"name": "",
"phoneContact": "",
"postalCode": "",
"stateProv": "",
"street": ""
},
"agent": "[email protected]",
"agentEmail": "[email protected]",
"allowedPassengerUpdates": {
"document_correction": {
"allowed": true,
"allowedPerPassengerType": {
"ADT": true
},
"fieldsToUpdate": [
"documentID",
"documentType",
"fiscalName",
"citizenshipCountryCode",
"residenceCountryCode",
"issuingCountryCode",
"expirationDate"
]
},
...
I serialize this data into an object model, and use this model for the actual consolidation.
To validate this, I wrote the following unit test:
public void IsJsonValid()
{
var expectedJson = LoadJson("Example.json");
// Generate a base object model using a generalized structure
var expected = JToken.Parse(expectedJson);
// Generating an object model using the defined classes
var actualModel = JsonConvert.DeserializeObject<OrderRetrieveResponse>(expectedJson);
// Converting the new object back into json
var actualJson = JsonConvert.SerializeObject(actualModel);
// Generating a new object using a generalized structure
var actual = JToken.Parse(actualJson);
// Comparing the 2
actual.Should().BeEquivalentTo(expected);
}
This approach works fine if the data provider keeps its JSON clean and doesn't start mixing data types throughout the file.
When I execute the test, the comparison (actual.Should().BeEquivalentTo(expected)
) throws an exception:

The exception more in detail:

What should I do differently to avoid this issue?