是否可以自动将JSON反序列化为数组的数组,即使JSON有时只包含一个数组元素,因此在技术上不表示数组的数组,而是表示单个数组元素?
json是一个图表,应该有许多[x,y]点值,但每隔一段时间它只有一个点。
仅包含一个数组元素时的示例数据:
{"data" : { "chart": [ 1, 1 ] } }
当它包含一个数组的数组时,它通常看起来像这样:
{"data": {"chart": [ [ 1, 1 ], [ 2, 2 ], [ 3, 3 ], [ 4, 4 ]]}}
我意识到我可以将其反序列化为:
public class Data
{
public List<object> chart { get; set; }
}
public class Root
{
public Data data { get; set; }
}
但我更希望有一个List<List<double>>
,即使它只包含一个数组元素和外部List,显然只包含List/array和一个元素/点。
- 这是否可以由一些自定义转换器通过System.Text.Json实现?
- 它也适用于JSON中的多个图表数据,即如果我有“chart 1”,“chart 2”,“chart 3”等。
短暂性脑缺血发作
P.S.我无法访问JSON生产者的代码,不幸的是,它只在只有一个点时才能像描述的那样工作(所以不,我不能让它返回x,y而不是[x,y],如果这是有效的JSON的话。
1条答案
按热度按时间xxls0lw81#
假设您的JSON数组始终只是一个2D或1D数组,您可以将您的c#属性声明为一个锯齿状2D列表
List<List<T>>
,并应用一个customJsonConverter
来检查传入的JSON是一个1D还是2D数组,如果不是2D数组,则反序列化一个List<T>
并返回包含该列表的List<List<T>>
。首先介绍以下转炉厂及转炉:
然后,修改
Data
如下:现在,您可以通过将
Jagged2DOr1DListConverter
添加到JsonSerializerOptions
来进行反序列化,如下所示:或者,您可以将转换器直接应用于
Data.chart
,如下所示:注:
Jagged2DOr1DListReadOnlyConverter
。Jagged2DOr1DListConverter
将自动转换所有List<List<T>>
类型,其中T
本身不是可枚举类型。如果只希望转换特定类型,请改为将Jagged2DOr1DListConverter<TItem>
的示例添加到JsonSerializerOptions.Converters
。Jagged2DOr1DListConverter<TItem>.HandleNull
,并在reader.TokenType == JsonTokenType.Null
时从Read()
引发异常。Jagged2DOr1DListConverter
自动转换。如果需要,你可以在Get2DListItemType(Type type)
中增强这个检查,为字典项返回一个非空的项类型:object
的值,因此内部项本身可能被序列化为数组。演示小提琴here。