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



我需要帮助从web Api获取数据。我使用EF和两个名为"Reichweites"one_answers"Points"(child)的表

这是我的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

  • Id
  • 名称
  • Potenzial
  • Geschlecht
  • CpGRP
  • ZielGRP
  • Benutzer

子表是点

  • Id
  • GRP
  • RW_TV
  • 成本_TV
  • Rw_ZuWGS
  • 成本_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和用户名填写。

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

你需要什么才能更好地理解我的问题?

[响应类型(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;
}

是的,我有。关键是保持简单。非常感谢斯科特。

现在,我的方法工作得很好,并提供了我想要的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"one_answers"$ref"是什么。

非常感谢

如果我从你的评论中正确理解,你会说你已经得到了所有的数据,你只需要将其转换为JOSN

只需更改控制器动作形式的最后一行:

return reich;

至:

return this.Json(reich);

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

试试这个:

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

这应该简化

最新更新