JSON对象创建PushStreamContent [英] JSON object creation PushStreamContent

查看:79
本文介绍了JSON对象创建PushStreamContent的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有asp.net网络api,并具有 HTTPResponseMessage 和api方法名称 GetPersonDataStream ,它们实际上将每个人对象作为json流化.因此,当我看到结果时,实际的数据就像两个单独的对象一样构造,并且两个对象之间没有逗号,这是不是按我的要求构造的.

I have asp.net web api and has a HTTPResponseMessage and the api method name GetPersonDataStream, which actually stream each person object as a json. So when I see the result the actual Data has been constructed like two seperate object's with no comma in between the two objects are it isn't constructed as I required.

实际流式数据: {名称":"Ram",年龄":30} {名称":"Sam",年龄":32} .

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

But I want this to streamed as a proper JSON as:

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

有没有一种方法可以实现它.以下是我用于流式传输数据的代码,因为记录数将达到数百万,并且我不想一次创建所有对象然后流式传输它,因为这可能导致Syste.OutOfMemory Exception.因此,有一种方法可以在流传输之前编辑/构造对象.如果是的话,我怎么能做到这一点.

Is there a way we can achieve it. Below is the code I use to stream the data because the number of records will be in millions and i don't want to create all the objects at once and then streaming it, because that may be lead to Syste.OutOfMemory Exception . So is there a way we could edit/construct the object before streaming it. If yes, how can i achieve it.

代码:

CODE:

    [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对象,并且仍然可以流式传输结果,而无需先在内存中构建所有内容.

With JSON.NET and it's JsonTextWriter, you can wrap all the items in a JSON object with an array and still stream the result without building everything in memory first.

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();
        }
    });

这篇关于JSON对象创建PushStreamContent的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆