在自定义JsonConverter中使用json中的另一个属性



假设以下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,而不是为每个子属性制作两个单独的转换器。

您没有说明在您的模型中哪个类包含ChannelMessage属性,所以为了示例起见,我只将其称为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 };
}
}

最新更新