将 json 反序列化到我的 C# 对象中会出错

Posted

技术标签:

【中文标题】将 json 反序列化到我的 C# 对象中会出错【英文标题】:deserialize json into my C# object gives error 【发布时间】:2021-08-02 16:24:16 【问题描述】:

我得到这样的 JSON 并希望将其反序列化为我的 C# 对象。但这最终会导致无法反序列化的错误。我可以得到帮助来解决这个问题吗?

 public class UserDto 
   public string Id  get; set; 
   public string Name  get; set; 
   public List<string> Permissions  get; set; 
 

上面是绑定API输出的模型对象

HttpResponseMessage response = await client.GetAsync($"/users");
if (!response.IsSuccessStatusCode || response.Content == null) 
  return null;

string result = await response.Content.ReadAsStringAsync();

UserDto users = await response.Content.ReadAsJsonAsync<UserDto>();

List<UserDto> x2 = JsonConvert.DeserializeObject<List<UserDto>>(result);

上面的getasync 方法给了我下面的结果,我正在尝试将它反序列化为对象。


    "users": [
        "id": "1",
        "name": "ttest",
        "permissions": [
            "add",
            "edit",
            "delete"
        ]
    ]

错误:

Cannot deserialize the current JSON object (e.g. "name":"value") 
into type 'System.Collections.Generic.List`1[****.Models.UserDto]' 
because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.

To fix this error either change the JSON to a JSON array (e.g. [1,2,3]) 
or change the deserialized type so that it is a normal .NET type 
(e.g. not a primitive type like integer, not a collection type like an
array or List<T>) that can be deserialized from a JSON object.
JsonObjectAttribute can also be added to the type to force it to 
deserialize from a JSON object.

我得到这样的 JSON 并希望将其反序列化为我的 C# 对象。但这最终会导致无法反序列化的错误。我可以得到帮助来解决这个问题吗?

【问题讨论】:

首先,不能把内容读两遍。如果您想将其作为字符串和 JSON 读取,则需要先将其复制到内存流。但我建议完全放弃这个字符串。从一开始就将其读取为 JSON,您只需要与 JSON 结构相对应的正确 DTO。 【参考方案1】:

在您的 JSON 中,Users JArray 在 JObject 中,因此要转换您的 JSON 字符串,您需要在 RootObject 类中使用 List&lt;User&gt;,例如,

public class User

    public string id  get; set; 
    public string name  get; set; 
    public List<string> permissions  get; set; 


public class Root

    public List<User> users  get; set; 

反序列化,

Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(result);

.NETFIDDLE

【讨论】:

以上是关于将 json 反序列化到我的 C# 对象中会出错的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中反序列化多个 JSON 对象?

无法将 JSON 数组反序列化为 C# 对象 [关闭]

当我尝试从 c# 中的 url 反序列化时出错

无法将 JSON 字符串反序列化为 C# 对象

c# 通过json.net中的JsonConverter进行自定义序列化与反序列化

将 XML 文件反序列化为 C# 类对象时出错