【问题标题】:deserialize json file with base64 encoded file attachments反序列化带有 base64 编码文件附件的 json 文件
【发布时间】:2017-06-01 15:11:26
【问题描述】:

我正在尝试使用 JSON.NET 从 JSON 文件反序列化 base64 文件附件。我可以使用以下代码反序列化数据,但我不确定如何解码 base64 文件。请告诉我。

Sample JSON file
-----------------
PostData: {
  "Main":{
     "date1": "14-JAN-2016",
     "summary": "summary test",
     "Details":[{
       "first": "test",
       "last": "last test",
        },
      ]}
     "attachments":[        {
       "title": "Report1.pdf",
       "file_name": "Report1.pdf",
       "file_content_type": "application/pdf",
       "file_format": "binary",
       "file_data": "JVBERi0xLjQNCjUgMCBvYmoNCjw8DQovVHlwZSAvWE9iamVjdA0KL1N1YnR5cGUg
        MSAwIFIvSW5mbyAxMjYgMCBSL0lEWzw0NTQ3QjRFREZBNjk2NDQ4QjhBNUU4MUQw
        QkU4MkVDMD48NDU0N0I0RURGQTY5NjQ0OEI4QTVFODFEMEJFODJFQzA+XSAvUHJl
        diAxMTI3OTI5L1hSZWZTdG0gMTEyNjMxNj4+DQpzdGFydHhyZWYNCjExNDAyNTEN
        CiUlRU9G",
        },
        {
       "title": "src.txt",
       "file_name": "src.txt",
       "file_content_type": "text/plain",
       "file_format": "text",
       "file_data": "bm5gLDJ9NC1DNFkpN20y4tLmM0",
        },
  ]}
}

程序.cs

var json = System.IO.File.ReadAllText("postData.json");
var myJsonObject = JsonConvert.DeserializeObject<PostData>(json);

    public class PostData
    {
        public Main main { get; set; }
    }

    public class Main
    {

        public string date1 { get; set; }
        public string summary { get; set; }
        public List<Details> details { get; set; }
    }

  public class Details
    {
        public string first { get; set; }
        public string last { get; set; }
    }

【问题讨论】:

  • 感谢您的回复。如何根据文件内容类型将反序列化的内容保存到本地驱动器。我在网上没有看到任何示例。
  • 您的 JSON 无效。我尝试使用此处显示的结果对其进行清理:pastebin.com/raw/SPxVx4MH。你能确认这是正确的吗?此外,您的第二个 "file_data""bm5gLDJ9NC1DNFkpN20y4tLmM0" 是无效的 Base64(字符串长度错误)。您是手动编辑这个还是需要反序列化这个真正的 Base64?

标签: c# json json.net base64


【解决方案1】:

正如 Serialization Guide 中所解释的,Json.NET 自动(反)序列化 Byte [] 数组作为 Base64 字符串。因此,在cleaning up your JSON 之后,您可以将其上传到http://json2csharp.com/ 以自动生成类,然后file_data 属性修改为byte [] 类型,结果如下所示:

public class Detail
{
    public string first { get; set; }
    public string last { get; set; }
}

public class Main
{
    public string date1 { get; set; }
    public string summary { get; set; }
    public List<Detail> Details { get; set; }
}

public class Attachment
{
    public string title { get; set; }
    public string file_name { get; set; }
    public string file_content_type { get; set; }
    public string file_format { get; set; }
    public byte [] file_data { get; set; }
}

public class PostData
{
    public Main Main { get; set; }
    public List<Attachment> attachments { get; set; }
}

现在可以反序列化如下:

var myJsonObject = JsonConvert.DeserializeObject<RootObject>(json);

然后,要将反序列化的字节数组保存到磁盘,您可以使用File.WriteAllBytes() 执行以下操作

foreach (var attachment in myJsonObject.PostData.attachments ?? Enumerable.Empty<Attachment>())
{
    File.WriteAllBytes(attachment.file_name, attachment.file_data);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-26
    • 2018-10-24
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 2019-02-08
    • 2014-09-12
    • 2011-07-27
    相关资源
    最近更新 更多