我有一个非常非常大的JSON文件(1000+ MB)相同的JSON对象.例如:
[
{
"id": 1,
"value": "hello",
"another_value": "world",
"value_obj": {
"name": "obj1"
},
"value_list": [
1,
2,
3
]
},
{
"id": 2,
"value": "foo",
"another_value": "bar",
"value_obj": {
"name": "obj2"
},
"value_list": [
4,
5,
6
]
},
{
"id": 3,
"value": "a",
"another_value": "b",
"value_obj": {
"name": "obj3"
},
"value_list": [
7,
8,
9
]
},
...
]
Run Code Online (Sandbox Code Playgroud)
根JSON列表中的每个项都遵循相同的结构,因此可以单独反序列化.我已经编写了C#类来接收这些数据,并且反序列化包含单个对象的JSON文件而没有列表按预期工作.
起初,我试图在循环中直接反序列化我的对象:
JsonSerializer serializer = new JsonSerializer();
MyObject o;
using (FileStream s = File.Open("bigfile.json", FileMode.Open))
using (StreamReader sr …Run Code Online (Sandbox Code Playgroud) 我正在将 ASP.NET Core 2 应用程序迁移到 ASP.NET Core 3。我的控制器需要返回具有已经是 JSON 字符串的属性的对象,因此它看起来像这样:
public class Thing {
public int Id { get; set; }
public string Name { get; set; }
public string Data { get; set; } // JSON Data
}
var thing = new Thing
{
Id = 1,
Name = "Thing",
Data = "{\"key\":\"value\"}"
};
Run Code Online (Sandbox Code Playgroud)
Thing应序列化,以便该Data属性不是字符串,而是 JSON 对象的一部分。像这样:
{
"id": 1,
"name": "Thing",
"data": {
"key": "value"
}
}
Run Code Online (Sandbox Code Playgroud)
在 .NET Core 2 中,Newtonsoft.Json我使用 的 …
可以说,我请求一个包含许多对象列表的大型json文件。我不希望它们一次全部出现在内存中,但我宁愿一个个地读取和处理它们。所以我需要将异步System.IO.Stream流转换为IAsyncEnumerable<T>。我如何使用新的System.Text.JsonAPI来做到这一点?
private async IAsyncEnumerable<T> GetList<T>(Uri url, CancellationToken cancellationToken = default)
{
using (var httpResponse = await httpClient.GetAsync(url, cancellationToken))
{
using (var stream = await httpResponse.Content.ReadAsStreamAsync())
{
// Probably do something with JsonSerializer.DeserializeAsync here without serializing the entire thing in one go
}
}
}
Run Code Online (Sandbox Code Playgroud) 我正在处理大型 JSON,其中一些元素包含以 Base 64 编码的大型(最多 100MB)文件。例如:
{ "name": "One Name", "fileContent": "...base64..." }
Run Code Online (Sandbox Code Playgroud)
我想将 fileContent 属性值存储在磁盘中(以字节形式)并将其替换为文件的路径,如下所示:
{ "name": "One Name", "fileRoute": "/route/to/file" }
Run Code Online (Sandbox Code Playgroud)
是否可以使用流或任何其他方式通过 System.Text.Json 来实现此目的,以避免在内存中使用非常大的 JSON?