【问题标题】:JSON - Newtonsoft Access ValueJSON - Newtonsoft 访问值
【发布时间】:2018-01-29 18:02:13
【问题描述】:

如何在C#中获取缓冲区的二进制数据?

item = {[_buffer, JVBERi0xLjMKJeLjz9MKMiAwIG9iago8PAovQ3JlYXRpb25EYXR]}

我试过了,但得到一个错误:

 HttpResponseMessage response = await client.GetAsync(url);
            if (response.IsSuccessStatusCode)
            {
                var dataStream = response.Content.ReadAsStringAsync().Result;
                var parsed = JObject.Parse(dataStream);
                if (dataStream == null)
                    return HttpNotFound();

                foreach (dynamic item in parsed)
                {
                    // If user decides to save the file, this will help...
                    Response.AddHeader("content-disposition", "filename=" + Path.GetFileName(fileDoc));
                    return File(item._buffer, "application/pdf");
                }
            }

【问题讨论】:

  • dataStream 变量包含什么 JSON?
  • 数据流= “{\” _缓冲\ “:\” JVBERi0xLjMKJeLjz9MKMiAwIG9iago8PAovQ3JlYXRpb25EYXRlIChEOjIwMTgwMTI2MjI0ODI1LTA1JzAwJykKL01vZERhdGUgKEQ6MjAxODAxMjYyMjQ4MjUtMDUnMDAnKQovUHJvZHVjZXIgKEJDTCBlYXN5UERGIDcuMDAgXCgwMzU1XCkpCi9DcmVhdG9yIChlYXN5UERGIFNESyA3IDcuMCkKPj4KZW5kb2JqCgo4I ... 跨度>
  • 您评论中的dataStream 包含一些奇怪的Unicode 字符,例如zero-width non-joiners。尝试将注释文本复制并粘贴到 Visual Studio 中,您将看到它们。那些真的存在吗?你能edit你的问题以例如方式显示实际的JSON吗? this one 会吗?
  • 这是我从上面“解析”出来的:item={ [ _buffer, JVBERi0xLjMKJeLjz9MKMiAwIG9iag ] }
  • { [ _buffer, JVBERi0xLjMKJeLjz9MKMiAwIG9iag ] } 不是有效的 JSON。上传到jsonlint.com,你会看到一个错误。我希望看到您收到的“原始”JSON 示例,以便我可以测试解决方案。否则我可以猜测一个解决方案,但它可能会或可能不会起作用。

标签: json json.net


【解决方案1】:

假设您的原始 JSON 看起来像这样:

{
  "_buffer": "JVBERi0xLjMKJeLjz9MKMiAwIG9iago8PAovQ3JlYXRpb25EYXRlIChEOjIwMTgwMTI2MjI0ODI1LTA1JzAwJykKL01vZERhdGUgKEQ6MjAxODAxMjYyMjQ4MjUtMDUnMDAnKQovUHJvZHVjZXIgKEJDTCBlYXN5UERGIDcuMDAgXCgwMzU1XCkpCi9DcmVhdG9yIChlYXN5UERGIFNESyA3IDcuMCkKPj4KZW5kb2JqCgo4"
}

那么“_buffer”属性的值将显示为Base64 编码的二进制文件。如其serialization guide 中所述,Json.NET 支持将 Base64 字符串自动反序列化为byte []。因此你可以这样做:

var _buffer = JsonConvert.DeserializeAnonymousType(dataStream, new { _buffer = (byte[])null })._buffer;

然后将返回的字节数组传递给Controller.File(Byte[], String)

通过使用JsonConvert.DeserializeAnonymousType(),您无需将(可能很大的)响应加载到中间JToken 层次结构中,也无需创建显式具体类型来反序列化单个byte [] 属性。

【讨论】:

  • 谢谢。这解决了它。
猜你喜欢
  • 2017-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-31
  • 1970-01-01
相关资源
最近更新 更多