skip to Main Content

Im getting an ‘SerializationException’ exception when deserializing data’s from json file:

public static T Deserialize(string FilePath)
{
    using (FileStream FS = new FileStream(FilePath, FileMode.OpenOrCreate))
    {
        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));

        return (T)serializer.ReadObject(FS) ?? null;
    }
}

and this is how im trying to deserialize:

ServiceEntity resultEntity = JsonHelper<ServiceEntity>.Deserialize(DestinationFilePath);

while (resultEntity != null)
{
    ListViewItem listViewItem = new ListViewItem(new string[] { resultEntity.ServiceName, resultEntity.ServiceStatus.ToString(), resultEntity.DisplayName });

    lvServices.Items.Add(listViewItem);
}

T is this:

[DataContract]
sealed class ServiceEntity
{
    [DataMember]
    public string DisplayName { get; set; }

    [DataMember]
    public string ServiceName { get; set; }

    [DataMember]
    public ServiceControllerStatus ServiceStatus { get; set; }
}

JSON data is : https://pastebin.com/M18GD8yh

2

Answers


  1. Your data is a single line of hundreds of JSON objects. The code reads the entire file and tries to deserialize it into a single C# object. You need to come up with a way to process each object separately. If you have control over the input file, it might be a good start to put the objects into an array, and deserialize that.

    [{
        "DisplayName": "AarSvc_2dae3",
        "ServiceName": "AarSvc_2dae3",
        "ServiceStatus": 1
    },{
        "DisplayName": "AMD External Events Utility",
        "ServiceName": "AMD External Events Utility",
        "ServiceStatus": 4
    }, {
    …
    }]
    
    Login or Signup to reply.
  2. what you call a json, is not a valid json string, it is just a collection of json-like peaces in one string. But you can easily fix it

    string json = File.ReadAllText(filePath;
    
    json="["+json.Replace("}{","},{")+"]";
    
    

    after this you can parse it as Json Array

    JArray services = JArray.Parse(json);
    

    or you can deserialize it in your c# class

    using Newtonsoft.Json;
    
    List<ServiceEntity> services = JsonConvert.DeserializeObject<List<ServiceEntity>>(json);
    

    or try your fancy serializer.

    Output in a json format

    [
      {
        "DisplayName": "AarSvc_2dae3",
        "ServiceName": "AarSvc_2dae3",
        "ServiceStatus": 1
      },
      {
        "DisplayName": "AMD External Events Utility",
        "ServiceName": "AMD External Events Utility",
        "ServiceStatus": 4
      },
      ....
    ]
    

    UPDATE

    If you have an acces to code to create a json from the c# object it is better to fix it there. IMHO you can use Newtonsonft.Json as a serializer . You can install it using a Nuget package. After this use this code

    using Newtonsoft.Json;
    
     List<ServiceEntity> services = ... your code to create list of services;
         
    var json = JsonConvert.SerializeObject(services);
         
    

    if you need to save this json in a file

    File.WriteAllText(FilePath, json);
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search