【问题标题】:JSON object creation PushStreamContentJSON 对象创建 PushStreamContent
【发布时间】:2018-10-08 03:02:41
【问题描述】:

我有 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; }
    }

【问题讨论】:

    标签: c# asp.net-web-api jsonstream pushstreamcontent


    【解决方案1】:

    使用JSON.NETJsonTextWriter,您可以使用数组将所有项目包装在一个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();
            }
        });
    

    【讨论】:

    • 非常感谢您的帮助!!
    猜你喜欢
    • 1970-01-01
    • 2015-07-22
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    • 2021-12-30
    • 2013-08-28
    • 2021-07-16
    相关资源
    最近更新 更多