【问题标题】:Newtonsoft JSON serialization for byte[] property [duplicate]字节 [] 属性的 Newtonsoft JSON 序列化 [重复]
【发布时间】:2018-06-26 18:50:07
【问题描述】:
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;
            }
        }

    }

有什么建议吗?

【问题讨论】:

  • According to the docs,默认情况下,一个byte[]被序列化为base64编码的String。您的解决方法似乎合理,但您可以轻松地制作一行 LINQ

标签: c# arrays json serialization json.net


【解决方案1】:

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

但是,您需要一个数字数组。我假设您不能简单地将 byte[] 更改为 int[] 对吧?

您的变通方法实际上是处理它的正确方法,如果您有兴趣(并且使用 C#6 或更高版本),可以将逻辑减少一点:

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

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

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

编辑

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-10
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多