繁体   English   中英

Json.Net 反序列化 c# 对象列表抛出错误

[英]Json.Net Deserializing list of c# objects throwing error

我有以下 json 格式的对象列表。 我想使用下面的代码反序列化。 它抛出无法转换为 object 错误。 我尝试了以下三个选项,但没有帮助。 jsoninput是使用ToJson()转换为 json object 的IEnumerable<string>

错误: {"Error converting value \"{\"id\":\"11ef2c75-9a6d-4cef-8163-94daad4f8397\",\"name\":\"bracing\",\"lastName\":\"male\",\"profilePictureUrl\":null,\"smallUrl\":null,\"thumbnailUrl\":null,\"country\":null,\"isInvalid\":false,\"userType\":0,\"profilePrivacy\":1,\"chatPrivacy\":1,\"callPrivacy\":0}\" to type 'Api.Models.UserInfo'. Path '[0]', line 1, position 271."}

var requests1 = JsonConvert.DeserializeObject<UsersInfo>(jsoninput);
var requests2 = JsonConvert.DeserializeObject<IEnumerable<UserInfo>>(jsoninput);
var requests3 = JsonConvert.DeserializeObject<List<UserInfo>>(jsoninput);

//Below are my classes,
public class UsersInfo

{
    public List<UserInfo> UserInfoList { get; set; }
    public UsersInfo()
    {
        UserInfoList = new List<UserInfo>();
    }
}

public class UserInfo
{
    public string Id { set; get; }
    public string Name { set; get; }
    public string LastName { set; get; }
    public string ProfilePictureUrl { set; get; }
    public string SmallUrl { set; get; }
    public string ThumbnailUrl { get; set; }
    public string Country { set; get; }
    public bool IsInvalid { set; get; }
}

下面是我的 json object,

["{\"id\":\"11ef2c75-9a6d-4cef-8163-94daad4f8397\",\"name\":\"bracing\",\"lastName\":\"male\",\"profilePictureUrl\":null,\"smallUrl\":null,\"thumbnailUrl\":null,\"country\":null,\"isInvalid\":false}","{\"id\":\"318c0885-2720-472c-ba9e-1d1e120bcf65\",\"name\":\"locomotives\",\"lastName\":\"riddles\",\"profilePictureUrl\":null,\"smallUrl\":null,\"thumbnailUrl\":null,\"country\":null,\"isInvalid\":false}"]

循环通过 json 输入中的各个项目,如果我像下面这样反序列化它,它工作正常。 但我想完全反序列化列表。 注意:在我转换为 json object 之前, jsoninput是一个IEnumerable<string>

foreach (var re in jsoninput)
{
    var request0 = JsonConvert.DeserializeObject<UserInfo>(re);
}

请看这个小提琴: https://dotnetfiddle.net/XpjuL4

这是代码:

using System;
using System.Collections.Generic;
using Newtonsoft.Json;

//Below are my classes,
public class UsersInfo 
{
    public List<UserInfo> UserInfoList { get; set; }
    public UsersInfo()
    {
        UserInfoList = new List<UserInfo>();
    }
}

public class UserInfo
{
    public string Id { set; get; }
    public string Name { set; get; }
    public string LastName { set; get; }
    public string ProfilePictureUrl { set; get; }
    public string SmallUrl { set; get; }
    public string ThumbnailUrl { get; set; }
    public string Country { set; get; }
    public bool IsInvalid { set; get; }
}

public class Program
{
    public static void Main()
    {
        Console.WriteLine("Hello World");
        Option1();
        Option2();
    }

    public static void Option1(){
        string json = @"{""UserInfoList"":[
            {""id"":""11ef2c75 - 9a6d - 4cef - 8163 - 94daad4f8397"",""name"":""bracing"",""lastName"":""male"",""profilePictureUrl"":null,""smallUrl"":null,""thumbnailUrl"":null,""country"":null,""isInvalid"":false},
            { ""id"":""318c0885-2720-472c-ba9e-1d1e120bcf65"",""name"":""locomotives"",""lastName"":""riddles"",""profilePictureUrl"":null,""smallUrl"":null,""thumbnailUrl"":null,""country"":null,""isInvalid"":false}
        ]}";
        var obj = JsonConvert.DeserializeObject<UsersInfo>(json);
        obj.UserInfoList.ForEach(e => Console.WriteLine(e.Id));
    }

    public static void Option2(){
    string json = @"[
            {""id"":""11ef2c75 - 9a6d - 4cef - 8163 - 94daad4f8397"",""name"":""bracing"",""lastName"":""male"",""profilePictureUrl"":null,""smallUrl"":null,""thumbnailUrl"":null,""country"":null,""isInvalid"":false},
            { ""id"":""318c0885-2720-472c-ba9e-1d1e120bcf65"",""name"":""locomotives"",""lastName"":""riddles"",""profilePictureUrl"":null,""smallUrl"":null,""thumbnailUrl"":null,""country"":null,""isInvalid"":false}
        ]";
        var obj = JsonConvert.DeserializeObject<List<UserInfo>>(json);
        obj.ForEach(e => Console.WriteLine(e.Id));
    }
}

两者都有效,并且基本上与您正在做的事情非常接近。 您可以将其序列化为列表(基于您的 json,我认为这是最接近您的用例的,这是选项 2)。

但是,请特别注意 JSON。 我不得不重新解析您的 JSON 以使其正常工作( https://jsonformatter.org/json-parser是一个不错的网站)。 为了解释示例,在 C# 中, @表示原始字符串,而在原始字符串中,引号用双引号""进行转义。

我希望生成此 JSON 的业务逻辑不正确,如果您粘贴的 JSON 是它的直接结果。

编辑鉴于OP的评论:

感谢 Tu.ma 的想法。 另一种方法返回 IEnumerable,它不过是 Dictionary.Where(x => x.Value == null).Select(x => x.Key).ToHashSet()。 Dictionary 中的值是 -> Key 是 String,Value 是 UserInfo object 序列化。 那么,在那种情况下,我应该一个一个反序列化? 如果没有,我应该一次性序列化整个列表吗? 我对吗? – 拉吉 12 小时前

问题在于您生成用户信息列表的方式。 Dictionary<string,string>.Where(x => x.Value == null).Select(x => x.Key).ToHashSet()的结果是一堆字符串,而不是对象,所以你需要将它们一一序列化。

如果您担心该方法的线性,您可以考虑并行运行它 当然,你需要判断它是否适合你的应用。

var userInfoStrings = Dictionary<string,string>.Where(x => x.Value == null).Select(x => x.Key).ToHashSet();

var UserInfoList = userInfoStrings.AsParallel().Select (u => JsonConvert.DeserializeObject<UsersInfo>(u)).ToList();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM