asp.net-web-api - 在 JsonConverter 中获取数组大小
问题描述
如果我正在运行类似于下面非常粗略的代码的 json 转换器,是否可以在不将阅读器从其起始位置移动的情况下获得数组的大小?或者我可以重置它的位置或克隆阅读器吗?
public override object ReadJson(JsonReader reader, Type objectType,
object existingValue, JsonSerializer serializer)
{
var jArray = JArray.Load(reader);
int arrayLength = jArray.Count;
return reader.Value;
}
更新 - 如果运行此代码,我在下面添加了一个人为的示例,您会看到尽管 Role 被标记为 JsonRequired 它不会因为阅读器在阅读器中移动超过该值而导致验证失败。读者的深度属性会给我可能需要的东西吗?
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
string json = @"{
'Email': 'james@example.com',
'Active': true,
'CreatedDate': '2013-01-20T00:00:00Z',
'Roles': [
{
'Access': 'Write'
}
]
}";
Account account = JsonConvert.DeserializeObject<Account>(json);
Console.WriteLine(account.Email);
}
}
public class Account
{
public string Email { get; set; }
public bool Active { get; set; }
public DateTime CreatedDate { get; set; }
[JsonConverter(typeof(CustomMaximumListLengthConverter), 1)]
public IList<Role> Roles { get; set; }
}
public class Role
{
[JsonRequired]
public string RoleName { get; set; }
public string Access { get; set; }
}
public class CustomMaximumListLengthConverter : JsonConverter
{
private readonly int _maxLength;
public CustomMaximumListLengthConverter(int maxLength)
{
_maxLength = maxLength;
}
public override object ReadJson(JsonReader reader, Type objectType,
object existingValue, JsonSerializer serializer)
{
var obj = JArray.Load(reader);
if(obj.Count > _maxLength)
{
throw new JsonSerializationException("Too many items");
}
return reader.Value;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override bool CanConvert(Type objectType)
{
throw new NotImplementedException();
}
}
}
我要补充一点,我知道我可以使用 ValidationContext 等验证模型,但我不想这样做。
另外,我已经意识到 reader.Value 在我想返回 IList 的地方返回 null,尽管这会引发反序列化错误。
编辑 2
在玩了之后,似乎下面的内容基本上以粗略和准备好的方式给了我我所追求的东西。有更好的方法吗?
public override object ReadJson(JsonReader reader, Type objectType,
object existingValue, JsonSerializer serializer)
{
var obj = JArray.Load(reader);
if (obj.Count > _maxLength)
{
throw new JsonSerializationException("Too many items");
}
return obj.ToObject(objectType);
}
解决方案
推荐阅读
- continuous-integration - 什么是工件,我如何分离我的项目?
- java - 使用 Kotlin 从 Fragment A 调用 Fragment B 的方法
- javascript - 从文件中获取文本并以 html 输出(简单自己的 CMS)
- r - R: 跨经度 (-)180 的 SpatialPolygon 变换坐标系
- c++ - 静态库单独很好,但在被引用时会抛出错误
- android - 如何在android中选择PDF文件
- raspberry-pi - Raspberry pi 3 b+ window IOT 在加载时卡住(无 Windows 徽标)
- javascript - 在子对象数组中搜索 - JavaScript
- python - Python从子列表中提取项目到变量中
- amazon-web-services - 为 AWS ElastiCache 启用 BGSAVE