将Web Api响应从c#对象转换为JSON

时间:2014-10-27 13:04:27

标签: asp.net-mvc entity-framework asp.net-web-api

我需要帮助从网络Api获取数据。我使用EF和两个名为" Reichweites"和"积分"(孩子)

这是我的DTO课程:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;

namespace xms_ef_vers1.Models
{
    public class ReichweitePointsDto
    {

        public ReichweitePointsDto() { }

        public ReichweitePointsDto(Reichweite reichweite)
        {
            ReichweiteID = reichweite.Id;
            Name = reichweite.Name;
            Potenzial = reichweite.Potenzial;
            Geschlecht = reichweite.Geschlecht;
            CPGRP = reichweite.CpGRP;
            ZielGRP = reichweite.ZielGRP;
            Benutzer = reichweite.Benutzer;

            PointListe = new List<PointListDto>();
            foreach (Points item in reichweite.PointListe)
            {
                PointListe.Add(new PointListDto(item));
            }
        }

        [Key]
        public int ReichweiteID { get; set; }
        public string Name { get; set; }
        //[Required]
        public int Potenzial { get; set; }
        //[Required]
        public string Geschlecht { get; set; }
        //[Required]
        public int CPGRP { get; set; }
        public int ZielGRP { get; set; }
        public string Benutzer { get; set; }

        public virtual List<PointListDto> PointListe { get; set; }

        public Reichweite ToEntity()
        {
            Reichweite reich = new Reichweite
            {
                Id = ReichweiteID,
                Name = Name,
                Potenzial = Potenzial,
                Geschlecht = Geschlecht,
                CpGRP = CPGRP,
                ZielGRP = ZielGRP,
                Benutzer = Benutzer,
                PointListe = new List<Points>()
            };

            foreach (PointListDto item in PointListe)
            {
                reich.PointListe.Add(item.ToEntity());
            }

            return reich;
        }

    }
}

我的数据模型:

1:n关系

主表是Reichweites

  • 编号
  • 姓名
  • Potenzial
  • Geschlecht
  • CpGRP
  • ZielGRP
  • Benutzer

子表是积分

  • 编号
  • GRP
  • RW_TV
  • Cost_TV
  • Rw_ZuWGS
  • Cost_I_Rea
  • ReichweiteId fk

我想以这种格式提供数据:

[   
  {
    "User":"testuser",
    "CPGRP":21321321,   
    "Sex":"men",    
    "Name": "test",
    "Potenzial":213213,
    "ReichweiteID":0,   
    "ZielGRP": 21321321 
    "PointList":[
                      {
                       "Cost_I_Rea":"22202771.01",
                       "Cost_TV":"213213210.0" ,
                       "GRP":10,   
                       "ID":0, 
                       "ReichweiteID_F":1, 
                       "RW_TV":"9.603",    
                       "RW_Zuwgs":"9.603",
                      },
                      {
                        "Cost_I_Rea":"22202771.01",
                        "Cost_TV":"213213210.0" ,
                        "GRP":10,   
                        "ID":0, 
                        "ReichweiteID_F":1, 
                        "RW_TV":"9.61103",  
                        "RW_Zuwgs":"9.6043",
                      },
                      {
                        "Cost_I_Rea":"22202771.01",
                        "Cost_TV":"213213210.0" ,
                        "GRP":10,   
                        "ID":0, 
                        "ReichweiteID_F":1, 
                        "RW_TV":"9.61103",  
                        "RW_Zuwgs":"9.6043",
                      },
                      {
                        "Cost_I_Rea":"22202771.01",
                        "Cost_TV":"213213210.0" ,
                        "GRP":10,   
                        "ID":0, 
                        "ReichweiteID_F":1, 
                        "RW_TV":"9.61103",  
                        "RW_Zuwgs":"9.6043",
                      }
              ]
   }
]

一些额外的要求是我必须通过id和用户名来适应。

这是我现在尝试的方法,但它不起作用。

你需要更好地理解我的问题?

[的responseType(typeof运算(Reichweite1Dto))]

public async Task<IHttpActionResult> GetReichweite(int id)
{
    var reich = await db.Points.Include(b => b.ReichweiteId)
        .Select(b => 
        new ReichweitePointsDto ()
        {
            Benutzer = b.Reichweite.Benutzer,
            Name = b.Reichweite.Name,
            Geschlecht = b.Reichweite.Geschlecht,
            CPGRP = b.Reichweite.CpGRP,
            Potenzial = b.Reichweite.Potenzial,
            ZielGRP = b.Reichweite.ZielGRP,
            PointListe = (from item in reich
                          select new Points()
                              {
                                  GRP = item.GRP,
                                  RW_TV = item.RW_TV,
                                  Cost_TV = item.Cost_TV,
                                  Rw_ZuWGS = item.RW_Zuwgs,
                                  Cost_I_Rea = item.Cost_I_Rea,
                              }).ToList()
          };
      return reich;
}

2 个答案:

答案 0 :(得分:1)

是的我拥有它。关键是保持简单。非常感谢Scott。

现在我的方法工作正常,并提供我想要的Json格式的数据!

这里的方法:

    namespace xms_ef_vers1.Controllers
    {
        public class TVKurveController : ApiController
        {
            private ReichweitenKurveContext db = new ReichweitenKurveContext();


            // GET api/TVKurve/5
            public IHttpActionResult GetReichweite(int id)
            {
                var obj = db.Reichweites.Where(r => r.Id == id && r.Benutzer == user.identity.name);
                return Ok(obj);
            }

            /////////////////////
            // GET api/TVKurve
            [ResponseType(typeof(ReichweitePointsDto))]

            public IEnumerable<Reichweite> GetReichweite()
            {
                var obj = db.Reichweites.Take(100);
                return obj;
            }
         }
   }

WebApiConfig.cs中缺少某人:

var json = config.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling =
Newtonsoft.Json.PreserveReferencesHandling.Objects;

config.Formatters.Remove(config.Formatters.XmlFormatter);

以下是结果如何:

[
    {
        "$id": "1",
        "PointListe": [
            {
                "$id": "2",
                "Reichweite": {
                    "$ref": "1"
                },
                "Id": 2771,
                "GRP": 10,
                "RW_TV": 1000,
                "Cost_TV": 15600,
                "Rw_ZuWGS": 1000,
                "Cost_I_Rea": 15.6,
                "ReichweiteId": 21
            },
            {
                "$id": "3",
                "Reichweite": {
                    "$ref": "1"
                },
                "Id": 2772,
                "GRP": 20,
                "RW_TV": 2000,
                "Cost_TV": 31200,
                "Rw_ZuWGS": 1000,
                "Cost_I_Rea": 15.6,
                "ReichweiteId": 21
            },
            {
                "$id": "4",
                "Reichweite": {
                    "$ref": "1"
                },
                "Id": 2773,
                "GRP": 30,
                "RW_TV": 3500,
                "Cost_TV": 46800,
                "Rw_ZuWGS": 1500,
                "Cost_I_Rea": 10.4,
                "ReichweiteId": 21
            },
            {
                "$id": "5",
                "Reichweite": {
                    "$ref": "1"
                },
                "Id": 2774,
                "GRP": 40,
                "RW_TV": 4500,
                "Cost_TV": 62400,
                "Rw_ZuWGS": 1000,
                "Cost_I_Rea": 15.6,
                "ReichweiteId": 21
            }
        ],
        "Id": 21,
        "Name": "Short Curve",
        "Potenzial": 132132132,
        "Geschlecht": "men",
        "CpGRP": 1560,
        "ZielGRP": 1560,
        "Benutzer": "admin"
    }
]

也许你可以告诉我“$ id”和“$ ref”是什么。

最好,非常感谢

答案 1 :(得分:0)

如果我理解正确形成您的评论,您说您已经获得了所有数据 - 您只需将其转换为JOSN

简单只需更改控制器操作表单的最后一行:

return reich;

为:

return this.Json(reich);

MVC和WebApi内置了JSON序列化程序

试试这个:

public IHttpActionResult GetReichweite(int id)
        {
            var obj = db.Points.Take(100);                
            return Ok(obj);
        }

应该简化事情