2014-10-27 1 views
0

Мне нужна помощь для получения данных из веб-сайта Api. Я использую EF с двумя таблицами под названием "Reichweites" и "Точки" (ребенок)преобразовать ответ WebApi от объекта C# к JSON

Это мой 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: п отношение

Главная таблица является Reichweites

  • Id
  • Имя
  • Potenzial
  • Geschlecht
  • CpGRP
  • ZielGRP
  • Benutzer

Детский Стол является Очки

  • Id
  • 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":".0" , 
         "GRP":10, 
         "ID":0, 
         "ReichweiteID_F":1, 
         "RW_TV":"9.603",  
         "RW_Zuwgs":"9.603", 
         }, 
         { 
         "Cost_I_Rea":"22202771.01", 
         "Cost_TV":".0" , 
         "GRP":10, 
         "ID":0, 
         "ReichweiteID_F":1, 
         "RW_TV":"9.61103", 
         "RW_Zuwgs":"9.6043", 
         }, 
         { 
         "Cost_I_Rea":"22202771.01", 
         "Cost_TV":".0" , 
         "GRP":10, 
         "ID":0, 
         "ReichweiteID_F":1, 
         "RW_TV":"9.61103", 
         "RW_Zuwgs":"9.6043", 
         }, 
         { 
         "Cost_I_Rea":"22202771.01", 
         "Cost_TV":".0" , 
         "GRP":10, 
         "ID":0, 
         "ReichweiteID_F":1, 
         "RW_TV":"9.61103", 
         "RW_Zuwgs":"9.6043", 
         } 
       ] 
    } 
] 

некоторые дополнительное требование заключается в том, что я должен fiter по 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; 
} 
+0

Я не понимаю вопроса, с чем именно вы столкнулись? как только вы заполнили модели данными, все, что вам нужно сделать, это в контроллере this.Json (reich); и он превратит объекты C# в JSON, как это для вас –

+0

Я не знаю, как мне нужно написать метод get, который я получаю как json-пример. –

+0

Что я имел в виду, правильно ли вы возвращаете все данные в C# объектов? и просто нужно, чтобы он был преобразован в JSON? –

ответ

1

Да я есть. Ключ должен был быть простым. Большое спасибо Скотту.

Теперь мой метод работает отлично и предоставляет данные в формате 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».

Лучшее и большое спасибо

+0

Преобразование немецкого языка в английский язык помогает слишком много до публикации –

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

, которые должны simpify вещи Abit

+0

Не работает. В методе что-то пошло не так. '(from item in reich выбрать новые очки()' reich is red подчеркнутый "пропавшая без комментариев « –

+0

yea - весь ваш запрос не выглядит так, как будто он может работать так, как вы его написали, я не был уверен в этом. Вы сказали, что успешно возвращаете данные - и спросили, как преобразовать эти данные в JSON - вот этот ответ, вот как это сделать –

+0

Извините, что я потерпел неудачу. Можете ли вы помочь мне получить нужные мне данные. –

Смежные вопросы