JsonConvert.DeserializeObject尝试将字节[]反序列化为IEnumerable时会引发异常

JsonConvert.DeserializeObject尝试将字节[]反序列化为IEnumerable时会引发异常<byte>

问题描述:

下面的代码无法在反序列化中出现以下错误。JsonConvert.DeserializeObject尝试将字节[]反序列化为IEnumerable时会引发异常<byte>

错误转换值 “AQID” 键入 'System.Collections.Generic.IEnumerable`1 [System.Byte]'

public class ByteArrayTest 
{ 
    public string SomeString { get; set; } 
    public IEnumerable<byte> ByteArray { get; set; } 
} 

using Newtonsoft.Json; 

[TestClass] 
public class UnitTest10 
{ 
    [TestMethod] 
    public void TestTheByteArraySerialization() 
    { 
     var test = new ByteArrayTest { ByteArray = new byte[] { 1, 2, 3 }, SomeString = "testing" }; 
     var serializedData = JsonConvert.SerializeObject(test); 
     //This line belows fails with an error of can't convert to IEnumerable<byte> 
     var myByeArrayClass = JsonConvert.DeserializeObject<ByteArrayTest>(serializedData); 
     Assert.AreEqual(test.ByteArray, myByeArrayClass.ByteArray); 

    } 
} 

在我的特殊情况下,我没有自己的ByteArrayTest类,这是只是这个问题的一个简单例子。我想要一个不涉及修改ByteArrayTest类的解决方案。理想情况下,我会传入某个DeserializeObject重载以使其正常工作,但我不确定是否解决此异常的最佳方法

您不能指望JsonConvert神奇地为接口。

你可以使用List<byte>byte[]代替IEnumerable<byte>如果你的建筑许可也可以添加一个字段,接口JSON序列化和隐藏自己的实际IEnumerable的从它。

private IEnumberable<byte> myBytes = null; 

[JsonProperty("BytesArray")] 
public string JsonBytes{ 
get{ 
    return String.Join("",myBytes.Select(b=>b.ToString("X2"))); // this may need tweaking, null checks etc 
} 
set{ 
    byte[] bytes = Convert.FromBase64String(value); 
    myBytes = bytes; 
} 

[JsonIgnore] 
public IEnumerable<byte> BytesArray{ 
    get{ return myBytes;} 
    set{ myBytes = value;} 
} 

你或许可以提供一个转换器来实现同样的事情,但我会说这是太多的摆弄,而不需要。

有关StringToByteArray上的多个实现的列表,请参见this post,我复制了最短的实现。

+0

我有点不清楚你的意思是向Json添加一个字段接口。为了更具体一点,我打电话给一个Web服务并接收这个“{\”SomeString \“:\”testing \“,\”ByteArray \“:\”AQID \“}”。所以我不能控制序列化。 – cgotberg

+0

更新了答案,它应该与你的json –

+0

谢谢。我可以在我的场景中完成这项工作。 – cgotberg