首页 新闻 搜索 专区 学院

C#中Newtonsoft能禁止将字节数组转成basic64字符串吗

0
[已解决问题] 解决于 2021-08-27 08:59

我现在用Newtonsoft将对象转成json字符串,如果对象中有字节数组,转出来的结果就是个basic64字符串,比如byte[] arr = new byte[10],转出来就是AAAAAAAAAAAAAA==,有没有什么办法能禁止这种格式,将其改成和其他数组一样的[0,0,0,0,0,0,0,0,0,0]这类的形式

WmW的主页 WmW | 初学一级 | 园豆:120
提问于:2021-08-25 10:36
< >
分享
最佳答案
0

可以自己写一个自定义序列化, 大概就是这样子

new JsonSerializerSettings().Converters.add(new myByteConverter())


class myByteConverter:  Newtonsoft.Json.Converters.CustomCreationConverter<byte[]>{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
            {
                writer.WriteStartArray();
                (value as byte[]).Each(b=>writer.WriteValue(b))
                writer.WriteEndArray();
            }
}
奖励园豆:5
czd890 | 专家六级 |园豆:12024 | 2021-08-25 11:30

我照着试了下,还是不行啊,断点调试,感觉根本就没有走myByteConverter的WriteJson,

WmW | 园豆:120 (初学一级) | 2021-08-26 09:55

@WmW: 上代码

czd890 | 园豆:12024 (专家六级) | 2021-08-26 10:10

@czd890:
class JsonTest {
class MyBinaryConverter : BinaryConverter {
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {
writer.WriteStartArray();
foreach (var b in (value as byte[])) {
writer.WriteValue(b);
}
writer.WriteEndArray();
}
}
public JsonTest() {
new JsonSerializerSettings().Converters.Add(new MyBinaryConverter());
}
public string GetJson<T>(T obj) {
return JsonConvert.SerializeObject(obj);
}
class Model {
public string Name { get; set; }
public byte[] Data { get; set; }
public int[] Buffer { get; set; }
}
public void Test() {
Model aaa = new Model();
aaa.Name = "张三";
aaa.Data = new byte[10];
aaa.Buffer = new int[10];
Console.WriteLine(GetJson(aaa));
}
}

WmW | 园豆:120 (初学一级) | 2021-08-26 11:43

@czd890: 控制台程序中

JsonTest jsonTest = new JsonTest();
jsonTest.Test();

WmW | 园豆:120 (初学一级) | 2021-08-26 11:44

@WmW:
JsonConvert.SerializeObject(obj, 请传入你自定义的JsonSerializerSettings);

另外MyBinaryConverter : BinaryConverter , 我可不是继承BinaryConverter 哦

czd890 | 园豆:12024 (专家六级) | 2021-08-26 12:19

@czd890: 还是不行啊,
class JsonTest {
class MyConverter : CustomCreationConverter<byte[]> {
public override byte[] Create(Type objectType) {
throw new NotImplementedException();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {
writer.WriteStartArray();
foreach (var b in (value as byte[])) {
writer.WriteValue(b);
}
writer.WriteEndArray();
}
}
JsonSerializerSettings settings = new JsonSerializerSettings();
public JsonTest() {
settings.Converters.Add(new MyConverter());
}
public string GetJson<T>(T obj) {
return JsonConvert.SerializeObject(obj, settings);
}
class Model {
public string Name { get; set; }
public byte[] Data { get; set; }
public int[] Buffer { get; set; }
}
public void Test() {
Model aaa = new Model();
aaa.Name = "张三";
aaa.Data = new byte[10];
aaa.Buffer = new int[10];
Console.WriteLine(GetJson(aaa));
}
}

WmW | 园豆:120 (初学一级) | 2021-08-26 14:56

@WmW:

MyConverter override CanWrite 返回true.

czd890 | 园豆:12024 (专家六级) | 2021-08-26 23:12

@czd890: 可以了,感谢

WmW | 园豆:120 (初学一级) | 2021-08-27 08:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册