json 序列化异常:无法反序列化数据协定类型< TypeName>,因为在输入中找到多个数据项< FieldName>

q9yhzks0  于 2023-01-22  发布在  其他
关注(0)|答案(2)|浏览(149)

从json文件反序列化数据时,我遇到“SerializationException”异常:

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;
    }
}

这就是我尝试反序列化的方式:

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是这样的:

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

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

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

JSON数据为:https://pastebin.com/M18GD8yh

gwo2fgha

gwo2fgha1#

您的数据是由数百个JSON对象组成的单行。代码读取整个文件并尝试将其反序列化为单个C#对象。您需要想出一种方法来单独处理每个对象。如果您可以控制输入文件,则将对象放入数组并反序列化可能是一个好的开始。

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

06odsfpq2#

你所称的json,不是一个有效的json字符串,它只是一个字符串中的一个json类peace的集合。但是你可以很容易地修复它

string json = File.ReadAllText(filePath;

json="["+json.Replace("}{","},{")+"]";

之后,您可以将其解析为Json数组

JArray services = JArray.Parse(json);

也可以在c#类中反序列化它

using Newtonsoft.Json;

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

或者试试你的串行器。
以json格式输出

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

更新
如果你有一个从c#对象创建json的代码,最好在那里修复它。恕我直言,你可以使用Newtonsonft.Json作为一个序列化器。你可以使用一个Nuget包来安装它。之后使用这段代码

using Newtonsoft.Json;

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

如果你需要保存这个json到一个文件中

File.WriteAllText(FilePath, json);

相关问题