无法将Json结果放入列表

时间:2019-08-11 09:29:58

标签: c# asp.net json asp.net-core

我正在使用ASP.Net Core 2.2。我的应用程序从产生XML内容的API获取数据。另一方面,我的应用程序期望使用Json数据,因此我必须将XML转换为Json,这是到目前为止我在 MyController

中所做的事情
public async Task<IActionResult> Index()
{
    List<ProductType> ProductTypes = new List<ProductType>();

    using (var httpClient = new HttpClient())
    {
            using (var response = await httpClient.GetAsync("https://localhost:44374/api/productTypes"))
            {
               string text = await response.Content.ReadAsStringAsync();
               XmlDocument doc = new XmlDocument();
               doc.LoadXml(text);
               var json = JsonConvert.SerializeXmlNode(doc);
               ProductTypes = JsonConvert.DeserializeObject<List<ProductType>>(json);
            }

    }
    return View("index", ProductTypes);
}

这是 ProductType 模型

public class ProductType
{

    public int Id { get; set; }
    public string Name { get; set; }
    public string Image { get; set; }

}

这是从API获取数据时控制器中 Json 变量的内容

"{\"ArrayOfProductType\":{\"@xmlns:i\":\"http://www.w3.org/2001/XMLSchema-instance\",\"@xmlns\":\"http://schemas.datacontract.org/2004/07/MyApi.Core.Models\",\"ProductType\":[{\"Id\":\"1\",\"Image\":\"/images/pizza.png\",\"Name\":\"Pizza\"},{\"Id\":\"2\",\"Image\":\"/images/burger.png\",\"Name\":\"Burger\"},{\"Id\":\"3\",\"Image\":\"/images/ad-salad.png\",\"Name\":\"Salad\"},{\"Id\":\"4\",\"Image\":\"/images/drinks.png\",\"Name\":\"Drinks\"}]}}"

这是索引视图

@model IEnumerable<ProductType>
@{
    ViewData["Title"] = "index";
}

<table class="table table-sm table-striped table-bordered m-2">
    <thead>
        <tr>
            <th>ID</th>
            <th>Name</th>
        </tr>
    </thead>
    <tbody>
        @foreach (var r in Model)
        {
            <tr>
                <td>@r.Id</td>
                <td>@r.Name</td>
            </tr>
        }
    </tbody>
</table>

但是当我运行程序时,出现此运行时错误

  

JsonSerializationException:无法反序列化当前JSON对象   (例如{“ name”:“ value”})   'System.Collections.Generic.List`1 [Pizza.Models.ProductType]',因为   该类型需要JSON数组(例如[1,2,3])进行反序列化   正确地。要解决此错误,请将JSON更改为JSON数组   (例如[1,2,3])或更改反序列化类型,使其成为常规   .NET类型(例如,不是整数之类的原始类型,不是集合   可以从JSON反序列化的类型(如数组或列表)   宾语。也可以将JsonObjectAttribute添加到类型中以强制它   从JSON对象反序列化。路径“ ArrayOfProductType”,第1行   位置22。

我在这里缺少什么?

我找到了表明问题的链接,但解决方案是什么?

Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1

2 个答案:

答案 0 :(得分:2)

为什么使用XmlDocument?您是否正在从API接收XML格式?如评论中所述,首先,最好使用虚拟列表测试Index()。

您可以尝试这样做并修改控制器的Index():

all_subfieldM_values = arrayfun(@(in) in.fieldB.subfieldM, my_struc.points)
all_subsubfieldZ_values = arrayfun(@(in) in.fieldC.subfieldN.subsubfieldZ, my_struc.points)

您可以定义模型DTO来包装和传输数据。但首先,请确保您的json与模型匹配。

*注意:如果您的API仅给出xml,则需要创建一些嵌套的模型类来模拟收到的xml的嵌套结构。此线程显示了一个很好的示例: How do Deserialize XML to json and json to c# classes?

答案 1 :(得分:0)

您的json不进行反序列化的原因是因为您仅在响应中没有列表,它是一个包含产品列表和两个其他json变量的对象。根据您发布的回复,您的模型应如下所示:

public class ProductType
{
    public string Id { get; set; }
    public string Image { get; set; }
    public string Name { get; set; }
}

public class ArrayOfProductType
{
    [JsonProperty(PropertyName = "@xmlns:i")]
    public string xmlnsi { get; set; }
    [JsonProperty(PropertyName = "@xmlns")]
    public string xmlns { get; set; }
    public List<ProductType> ProductType { get; set; }
}

public class RootObject
{
    public ArrayOfProductType ArrayOfProductType { get; set; }
}

然后反序列化对象,如下所示:

var result = JsonConvert.DeserializeObject<RootObject>(json);