Home > Back-end >  Cannot deserialize the current JSON in C#
Cannot deserialize the current JSON in C#

Time:08-30

I faced the problem: Cannot deserialize the current JSON object.

As follows:

public List<Track> Tracks { get; set; }

public async Task<List<Track>> GetTracking()
{

    using (var httpClient = new HttpClient())
    {
        using (var requests = new HttpRequestMessage(new HttpMethod("GET"), "urlxxxxxxxx..."))
        {
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            requests.Headers.TryAddWithoutValidation("accept", "application/json");

            var response = await httpClient.SendAsync(requests);

            using (HttpContent content = response.Content)
            {
                var jsonStr = content.ReadAsStringAsync().GetAwaiter().GetResult();
                var res = JsonConvert.DeserializeObject<List<Track>>(jsonStr); //Get Error**
                Tracks = res;
            }
        }
    }

    return Tracks;
}

Model Class

public class Track
{
    public List<Events> events { get; set; }
}

public class Events
{
    public string eventID { get; set; }
    public string eventType { get; set; }
    public string eventDateTime { get; set; }
    public string eventCreatedDateTime { get; set; }
    public string eventClassifierCode { get; set; }
    public string transportEventTypeCode { get; set; }
    public string documentID { get; set; }
    public string shipmentEventTypeCode { get; set; }
    public List<DocumentReferences> documentReferences { get; set; }
    public TransportCall transportCall { get; set; }
}
public class DocumentReferencesMearsk
{
    public string documentReferenceType { get; set; }
    public string documentReferenceValue { get; set; }
}
public class TransportCallMaersk
{
    public string transportCallID { get; set; }
    public string carrierServiceCode { get; set; }
    public string exportVoyageNumber { get; set; }
    public string importVoyageNumber { get; set; }
    public int transportCallSequenceNumber { get; set; }
    public string UNLocationCode { get; set; }
    public string facilityCode { get; set; }
    public string facilityCodeListProvider { get; set; }
    public string facilityTypeCode { get; set; }
    public string otherFacility { get; set; }
    public string modeOfTransport { get; set; }
    public LocationMearsk location { get; set; }
    public VesselMearsk vessel { get; set; }
}

My input data:

enter image description here

As in my description. I get the error: I get the error: Newtonsoft.Json.JsonSerializationException: 'Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1[XX. Models.Track]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.

Even though I declared: public List events { get; set; }

Is the problem I have misunderstood the format of DeserializeObject. Looking forward to everyone's help. Thank

CodePudding user response:

you have an object, not an array

var res = JsonConvert.DeserializeObject<Track>(jsonStr);

and fix class

public class Events
{
    ....
    public List<DocumentReferencesMearsk> documentReferences { get; set; }
    public TransportCallMaersk transportCall { get; set; }
}

CodePudding user response:

Your model is incomplete and has typos. Assuming you have the correct versions of them. You are doing:

var res = JsonConvert.DeserializeObject<List<Track>>(jsonStr); 

which should be just:

var res = JsonConvert.DeserializeObject<Track>(jsonStr); 

Your json doesn't have an array at the root level.

Full working sample:

void Main()
{
    var res = JsonConvert.DeserializeObject<Track>(myJson);
}

public class Track
{
    public List<Events> events { get; set; }
}

public class Events
{
    public string eventID { get; set; }
    public string eventType { get; set; }
    public string eventDateTime { get; set; }
    public string eventCreatedDateTime { get; set; }
    public string eventClassifierCode { get; set; }
    public string transportEventTypeCode { get; set; }
    public string documentID { get; set; }
    public string shipmentEventTypeCode { get; set; }
    public List<DocumentReferencesMearsk> documentReferences { get; set; }
    public TransportCallMaersk transportCall { get; set; }
}
public class DocumentReferencesMearsk
{
    public string documentReferenceType { get; set; }
    public string documentReferenceValue { get; set; }
}
public class TransportCallMaersk
{
    public string transportCallID { get; set; }
    public string carrierServiceCode { get; set; }
    public string exportVoyageNumber { get; set; }
    public string importVoyageNumber { get; set; }
    public int transportCallSequenceNumber { get; set; }
    public string UNLocationCode { get; set; }
    public string facilityCode { get; set; }
    public string facilityCodeListProvider { get; set; }
    public string facilityTypeCode { get; set; }
    public string otherFacility { get; set; }
    public string modeOfTransport { get; set; }
    public Location location { get; set; }
    public Vessel vessel { get; set; }
}
public partial class Location
{
    public string LocationName { get; set; }
    public string Latitude { get; set; }
    public string Longitude { get; set; }
    public string UnLocationCode { get; set; }
    public string FacilityCode { get; set; }
    public string FacilityCodeListProvider { get; set; }
}

public partial class Vessel
{
    public long VesselImoNumber { get; set; }
    public string VesselName { get; set; }
    public string VesselFlag { get; set; }
    public string VesselCallSignNumber { get; set; }
    public string VesselOperatorCarrierCode { get; set; }
    public string VesselOperatorCarrierCodeListProvider { get; set; }
}


static readonly string myJson = @"{
  ""events"": [
    {
      ""eventID"": ""6832920321"",
      ""eventType"": ""SHIPMENT"",
      ""eventDateTime"": ""2019-11-12T07:41:00 08:00"",
      ""eventCreatedDateTime"": ""2021-01-09T14:12:56Z"",
      ""eventClassifierCode"": ""ACT"",
      ""shipmentEventTypeCode"": ""DRFT"",
      ""documentTypeCode"": ""SHI"",
      ""documentID"": ""205284917""
    },
    {
      ""eventID"": ""6832920321"",
      ""eventType"": ""TRANSPORT"",
      ""eventDateTime"": ""2019-11-12T07:41:00 08:00"",
      ""eventCreatedDateTime"": ""2021-01-09T14:12:56Z"",
      ""eventClassifierCode"": ""ACT"",
      ""transportEventTypeCode"": ""ARRI"",
      ""documentReferences"": [
        {
          ""documentReferenceType"": ""BKG"",
          ""documentReferenceValue"": ""ABC123123123""
        },
        {
          ""documentReferenceType"": ""TRD"",
          ""documentReferenceValue"": ""85943567-eedb-98d3-f4ed-aed697474ed4""
        }
      ],
      ""transportCall"": {
        ""transportCallID"": ""123e4567-e89b-12d3-a456-426614174000"",
        ""carrierServiceCode"": ""FE1"",
        ""exportVoyageNumber"": ""2103S"",
        ""importVoyageNumber"": ""2103N"",
        ""transportCallSequenceNumber"": 2,
        ""UNLocationCode"": ""USNYC"",
        ""facilityCode"": ""ADT"",
        ""facilityCodeListProvider"": ""SMDG"",
        ""facilityTypeCode"": ""POTE"",
        ""otherFacility"": ""Balboa Port Terminal, Avenida Balboa Panama"",
        ""modeOfTransport"": ""VESSEL"",
        ""location"": {
          ""locationName"": ""Eiffel Tower"",
          ""latitude"": ""48.8585500"",
          ""longitude"": ""2.294492036"",
          ""UNLocationCode"": ""USNYC"",
          ""facilityCode"": ""ADT"",
          ""facilityCodeListProvider"": ""SMDG""
        },
        ""vessel"": {
          ""vesselIMONumber"": 1801323,
          ""vesselName"": ""King of the Seas"",
          ""vesselFlag"": ""DE"",
          ""vesselCallSignNumber"": ""NCVV"",
          ""vesselOperatorCarrierCode"": ""MAEU"",
          ""vesselOperatorCarrierCodeListProvider"": ""NMFTA""
        }
      }
    }
  ]
}";

EDIT: Result is something like:

Result sample

  • Related