Newtonsoft JSON 序列化 byte[] 属性

Pra*_*ant 6 c# arrays serialization json 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="}
Run Code Online (Sandbox Code Playgroud)

我想要像 "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;
            }
        }

    }
Run Code Online (Sandbox Code Playgroud)

有什么建议 ?

mac*_*ura 6

文档中声明 aByte[]将被序列化为 Base64 编码字符串。所以它正在按预期工作。

但是你需要一个数字数组。我认为你不能简单地将 改为byte[]右边int[]

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

public int[] MessageBytes => Bytes?.Select(x => (int)x).ToArray() ?? new int[0];
Run Code Online (Sandbox Code Playgroud)

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

DotNetFiddle 不允许在 Roslyn 编译器中使用 nuget 包,因此我无法演示序列化。然而,这个小提琴演示了我刚刚展示的 LINQ 逻辑。

编辑

我认为链接的重复项比仅仅执行 a具有更好的答案int[],请在求助于 int 数组之前尝试查看它。