我正在使用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。
我在这里缺少什么?
我找到了表明问题的链接,但解决方案是什么?
答案 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);