用于byte []属性的Newtonsoft JSON序列化

时间:2018-01-17 19:39:02

标签: c# arrays json serialization json.net

public class MyClass
{
   public byte[] Bytes{get;set;}
}

MyClass obj = new MyClass();
obj.Bytes = new byte[]{1,22,44,55};

string s_result = Newtonsoft.Json.JsonConvert.SerializeObject(obj);

// my s_result looks like {"Bytes":"KQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="}

我想要像“Bytes”这样的结果:“1,22,44,55”

我通过在类

中再创建一个int []属性来解决这个问题
 public class MyClass
    {
       [JsonIgnore]
       public byte[] Bytes{get;set;}
       public int[] MessageByte
        {
            get
            {
              if (this.Bytes == null)
                return null;
                int[] result = new int[this.Bytes.Length];
                for (int i = 0; i < this.Bytes.Length; i++)
                {
                    result[i] = this.Bytes[i];
                }
                return result;
            }
        }

    }

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

docs中声明Byte[]将被序列化为Base64编码的字符串。所以它按预期工作。

但是你需要一组数字。我假设您不能简单地将byte[]更改为int[]权利吗?

你的解决方法实际上是处理它的正确方法,如果你感兴趣(并使用C#6或更高版本),你可以减少逻辑:

public int[] MessageBytes => Bytes?.Select(x => (int)x).ToArray() ?? new int[0];

如果Bytes为null,这将“短路”,并返回一个空的int数组,如果Bytes不为null,它会将所有字节转换为int,然后将其作为数组。

DotNetFiddle不允许在Roslyn编译器中使用nuget包,因此我无法演示序列化。但是this fiddle演示了我刚刚展示的LINQ逻辑。

修改

我认为链接的副本有一个much better answer,而不仅仅是int[],尝试在使用int数组之前查看它。