【问题标题】:Implementation custom Newtonsoft JsonConverter (reader)实现自定义Newtonsoft JsonConverter(阅读器)
【发布时间】:2020-03-10 14:20:46
【问题描述】:

我有一个使用自定义 Newtonsoft Jsonconverter 写入 Json 的对象。该对象有两个变量(vec3 点数组和三角形索引数组)。这些值需要在 json 中存储为 base64 字符串。

编写器按预期工作,但我不知道如何读回数据并重新创建对象。

对象类定义:

public class Outline
{
    [JsonConverter(typeof(ObjectToBase64Converter))]
    public vec3[] Points { get; set; }
    [JsonConverter(typeof(ObjectToBase64Converter))]
    public int[] TriangleIndices { get; set; }
}

自定义 Json 转换器:

internal class ObjectToBase64Converter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(string);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        // ?? I've got no clue ??

    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        using (MemoryStream memoryStream = new MemoryStream())
        {
            new BinaryFormatter().Serialize(memoryStream, value);
            string base64String = Convert.ToBase64String(memoryStream.ToArray());
            writer.WriteValue(base64String);
        }
    }
}

任何帮助将不胜感激,我已经坚持了好几个小时了。

【问题讨论】:

    标签: json json.net base64 jsonconverter


    【解决方案1】:

    你可以这样定义

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JToken token = JToken.Load(reader);
        // Convert the Base64 Value to Bytes
        var dataBytes = Convert.FromBase64String(token.Value<String>());
        // Deserialize the Binary Formatted Data
        using (MemoryStream ms = new MemoryStream(dataBytes))
        {
            IFormatter br = new BinaryFormatter();
            return Convert.ChangeType(br.Deserialize(ms),objectType);
        }
    }
    
    

    【讨论】:

    • 感谢您抽出宝贵时间!我试图编译,但我得到一个“找不到类型或命名空间”令牌“”。我搜索了谷歌,但找不到明确的答案。这就是我到目前为止所包含的内容:使用 Newtonsoft.Json;使用 Newtonsoft.Json.Linq;使用系统;使用 System.IO;使用 System.Runtime.Serialization.Formatters.Binary;使用 System.Runtime.Serialization;关于我缺少什么的任何想法?
    • @Schiette 你的意思是 JToken 还是 token ? JToken 在 Newtonsoft.Json.Linq 中可用。如果后者是错误,我猜你错过了一行“JToken token = JToken.Load(reader);”
    • 很抱歉,我没有仔细看你的帖子。感谢您花时间帮助我,它现在完美运行!
    • @Schiette 很高兴为您提供帮助。如果它帮助您解决问题,请将答案标记为有用/答案stackoverflow.com/help/someone-answers
    猜你喜欢
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多