gpt4 book ai didi

c# - 尝试反序列化 json 时无法在 JsonConvert 之后实现 Iterator 设计模式

转载 作者:太空宇宙 更新时间:2023-11-03 15:12:32 27 4
gpt4 key购买 nike

我有以下对象,它与我从发送的一个 REST 请求中获得的 JSON 对象的模式相匹配:

public class MyObject
{
public List<string> columns { get; set; }
public List<List<string>> rows { get; set; }
public DisplayValue displayValue { get; set; }
public string currency { get; set; }
public object alert { get; set; }
}

public class DisplayValue
{
public Id DisplayId { get; set; }
}

public class Id
{
public List<string> IdToName { get; set; }
}

这个对象与我得到的响应相匹配,下一个代码与 MyObject 的上层实现一起工作(我使用的是 C# 的 RestSharp):

        var response = client.Execute(request);
result = JsonConvert.DeserializeObject<MyObject>(response.Content);

现在我想在 MyObject 上实现 Iterator 设计模式,因为 MyObject.rows 是我实际使用的唯一字段。

所以我将 MyObject 类更改为以下内容

public class MyObject : IEnumerable<List<string>
{
public List<string> columns { get; set; }
public List<List<string>> rows { get; set; }
public DisplayValue displayValue { get; set; }
public string currency { get; set; }
public object alert { get; set; }
}


public IEnumerator<List<string>> GetEnumerator()
{
foreach (List<string> row in rows)
{
yield return row;
}
}

IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}

public class DisplayValue
{
public Id DisplayId { get; set; }
}

public class Id
{
public List<string> IdToName { get; set; }
}

但是当我尝试 JSONConvert 时,出现以下异常:

Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'MyObject' 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) 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.NET 将尝试序列化任何实现 IEnumerable<T> 的 POCO对于一些 T作为 JSON 数组 而不是 JSON 对象,如文档中所述here .由于您的 JSON 可能不是数组,因此您会收到所看到的异常。

因为你不想要你的 MyObject序列化为数组,您可以强制 Json.NET 将其(反)序列化为对象,而不是通过使用 [JsonObject] 标记它:

[JsonObject]
public class MyObject : IEnumerable<List<string>>
{
public List<string> columns { get; set; }
public List<List<string>> rows { get; set; }
public DisplayValue displayValue { get; set; }
public string currency { get; set; }
public object alert { get; set; }

// Implementation of IEnumerable<List<string>>...
}

参见 JsonObjectAttribute force object serialization .

关于c# - 尝试反序列化 json 时无法在 JsonConvert 之后实现 Iterator 设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40466394/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com