gpt4 book ai didi

c# - JSON 对象创建 PushStreamContent

转载 作者:太空宇宙 更新时间:2023-11-03 12:15:23 26 4
gpt4 key购买 nike

我有 asp.net web api 和 HTTPResponseMessage 和 api 方法名称 GetPersonDataStream,它实际上将每个人对象作为 json 流式传输。因此,当我看到结果时,实际数据的构造就像两个单独的对象,两个对象之间没有逗号,它没有按照我的要求构造。

实际流数据:{"Name":"Ram","Age":30}{"Name":"Sam","Age":32}

但我希望将其作为适当的 JSON 流式传输为:

{"response": [ {"Name":"Ram","Age":30}, {"Name":"Sam","Age":32} ]}

有什么办法可以实现吗?下面是我用来流式传输数据的代码,因为记录的数量将以数百万计,我不想一次创建所有对象然后流式传输它,因为这可能会导致 Syste.OutOfMemory Exception 。那么有没有一种方法可以在流式传输之前编辑/构建对象。如果是,我该如何实现。

代码:

    [HttpGet]
[Route("GetPersonDataStream")]
public HttpResponseMessage GetPersonDataStream()
{
List<Person> ps = new List<Person>();
Person p1 = new Person();
p1.Name = "Ram";
p1.Age = 30;

Person p2 = new Person();
p2.Name = "Sam";
p2.Age = 32;

ps.Add(p1);
ps.Add(p2);

var response = this.Request.CreateResponse(HttpStatusCode.OK);

response.Content =
new PushStreamContent((stream, content, context) =>
{
foreach (var item in ps)
{
//var result = _clmmgr.GetApprovedCCRDetail(item.ccr_id, liccrDetails);
var serializer = new JsonSerializer();
using (var writer = new StreamWriter(stream))
{
serializer.Serialize(writer, item);
stream.Flush();
}
}
});

return response;
}

public class Person
{
public string Name {get;set;}
public int Age { get; set; }
}

最佳答案

JSON.NET它是 JsonTextWriter,您可以使用数组将所有项目包装在一个 JSON 对象中,并且仍然流式传输结果,而无需先在内存中构建所有内容。

response.Content =
new PushStreamContent((stream, content, context) =>
{
using (var sw = new StreamWriter(stream))
using (var jsonWriter = new JsonTextWriter(sw))
{
jsonWriter.WriteStartObject();
{
jsonWriter.WritePropertyName("response");
jsonWriter.WriteStartArray();
{
foreach (var item in ps)
{
var jObject = JObject.FromObject(item);
jObject.WriteTo(jsonWriter);
}
}
jsonWriter.WriteEndArray();
}
jsonWriter.WriteEndObject();
}
});

关于c# - JSON 对象创建 PushStreamContent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50059481/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com