假设以下JSON:
{
"channel": "751853588527054938"
"message": "751853745758928908"
}
以及以下代码部分:
[JsonConverter(typeof(TextChannelConverter))]
[JsonProperty("channel")]
public ITextChannel Channel;
[JsonConverter(typeof(UserMessageConverter))]
[JsonProperty("message")]
public IUserMessage Message;
我想做的是,我想有一个自定义的转换器来取消这两种类型的实现,但问题是,如果我只有消息的ID,我就无法获得消息,我还需要知道信道ID才能这样做(更准确地说,消息是使用ITextChannel#GetMessageAsync(ulong ID(检索的(。是否有方法访问UserMessageConverter中通道甚至通道对象的ID?
我已经尝试从阅读器加载整个JSON
class UserMessageConverter : JsonConverter
{
public override bool CanWrite => false;
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) => throw new NotImplementedException();
public override bool CanConvert(Type objectType) => objectType == typeof(IUserMessage);
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JObject jobj = JObject.Load(reader);
return null;
}
但它发布了一个例外:
Newtonsoft.Json.JsonReaderException: Error reading JObject from JsonReader. Current JsonReader item is not an object: Integer. Path 'message', line 1, position 75.
供参考,TextChannelConverter的代码:
class TextChannelConverter : JsonConverter
{
public override bool CanWrite => false;
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) => throw new NotImplementedException();
public override bool CanConvert(Type objectType) => objectType == typeof(ITextChannel);
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.Value == null)
return null;
ulong channelid = ulong.Parse(reader.Value.ToString());
return Essentials.FireLands.GetChannel(channelid);
}
如果其中一个属性依赖于另一个属性,则需要制作一个处理父对象的JsonConverter
,而不是为每个子属性制作两个单独的转换器。
您没有说明在您的模型中哪个类包含Channel
和Message
属性,所以为了示例起见,我只将其称为Chat
。
所以你会有:
[JsonConverter(typeof(ChatConverter))]
class Chat
{
public ITextChannel Channel { get; set; }
public IUserMessage Message { get; set; }
}
然后你的转换器可能看起来像这样:
class ChatConverter : JsonConverter
{
public override bool CanConvert(Type objectType) => objectType == typeof(Chat);
public override bool CanWrite => false;
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) => throw new NotImplementedException();
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.Value == null)
return null;
JObject obj = JObject.Load(reader);
ulong channelId = (ulong)obj["channel"];
ulong messageId = (ulong)obj["message"];
ITextChannel channel = Essentials.FireLands.GetChannel(channelId);
IUserMessage = channel.GetMessageAsync(messageId).Result;
return new Chat { Channel = channel, Message = message };
}
}