.NET 自定义 Json 列表或单个项目的转换器
.NET custom Json converter for list or single item
我的目标是使用 System.text.Json
解析来自其余 api 的响应。
响应 returns 一个或多个项目 - 但如果只返回一个项目,则它周围没有括号 []
(这使得它难以解析)。
反序列化:
// i need a list here to process data
var response = JsonSeralizer.Deseralize<IList<ExampleResponse>>(content);
示例响应 1:
[
{
"Status": "Healthy"
},
{
"Status": "Healthy"
}
]
示例响应 2:
{
"Status": "Healthy"
}
如何使用 JsonConverter<T>
编写自定义转换器,它可以解析单个项目或整个列表?
一种选择是创建自定义转换器(继承自 JsonConverter)
虽然在这种情况下我可能会写
var isList = content.StartsWith("[");
var response = isList ? JsonSeralizer.Deseralize<IList<ExampleResponse>>(content)
: new IList<ExampleResponse> { JsonSeralizer.Deseralize<ExampleResponse>(content) };
您可以检查 content
是否以“{”开头,在这种情况下反序列化为单个项目,然后从单个项目创建新的 List
。
List<ExampleResponse> response;
if (content.StartsWith("{"){
response = new List<ExampleResponse>(){
JsonSerilizer.Deserialize<ExampleResponse>(content)
};
else
{
response = JsonSeralizer.Deseralize<IList<ExampleResponse>>(content);
}
如果您无法更改 REST API 的输出以强制它始终 return 一个数组,您可以在解析之前检查字符串,并添加括号。然后解析。
我做了这个例子:https://dotnetfiddle.net/dhZIKq
我的目标是使用 System.text.Json
解析来自其余 api 的响应。
响应 returns 一个或多个项目 - 但如果只返回一个项目,则它周围没有括号 []
(这使得它难以解析)。
反序列化:
// i need a list here to process data
var response = JsonSeralizer.Deseralize<IList<ExampleResponse>>(content);
示例响应 1:
[
{
"Status": "Healthy"
},
{
"Status": "Healthy"
}
]
示例响应 2:
{
"Status": "Healthy"
}
如何使用 JsonConverter<T>
编写自定义转换器,它可以解析单个项目或整个列表?
一种选择是创建自定义转换器(继承自 JsonConverter)
虽然在这种情况下我可能会写
var isList = content.StartsWith("[");
var response = isList ? JsonSeralizer.Deseralize<IList<ExampleResponse>>(content)
: new IList<ExampleResponse> { JsonSeralizer.Deseralize<ExampleResponse>(content) };
您可以检查 content
是否以“{”开头,在这种情况下反序列化为单个项目,然后从单个项目创建新的 List
。
List<ExampleResponse> response;
if (content.StartsWith("{"){
response = new List<ExampleResponse>(){
JsonSerilizer.Deserialize<ExampleResponse>(content)
};
else
{
response = JsonSeralizer.Deseralize<IList<ExampleResponse>>(content);
}
如果您无法更改 REST API 的输出以强制它始终 return 一个数组,您可以在解析之前检查字符串,并添加括号。然后解析。
我做了这个例子:https://dotnetfiddle.net/dhZIKq