![](/img/trans.png)
[英]c# Json.net deserializing List<Dictionary<string,object>>
[英]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.