Med Elgarnaoui
Med Elgarnaoui

Reputation: 1667

Can't serialize a list properly in .net mvc web app

I have a web service in .net but when i excute it with postman I get just a string json.

this my function :

        using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using WebApplication2.Models;

namespace WebApplication2.Controllers
{
    public class ProduitController : ApiController
    {
        MyDataBaseContext dbcontext = new MyDataBaseContext();

        public IEnumerable<Produit> Get()
        {
            IList<Produit> produit = null;
            using (dbcontext)
            {
                produit = dbcontext.Produit.Include("Liste produit")
                      .Select(s => new Produit()
                      {
                          IdProduit=s.IdProduit,
                          NumeroSerie =s.NumeroSerie,
                          NomProduit=s.NomProduit,
                          Prix=s.Prix,
                          Quantite=s.Quantite,
                          IdModel=s.IdModel,
                          IdModelNavigation=s.IdModelNavigation

                      }).ToList<Produit>();
            }
            return produit;
        }

        // GET api/<controller>/5
        public string Get(int id)
        {
            var produit = dbcontext.Produit.AsQueryable().
                     Where(i => i.IdProduit== id).ToList();
            if (produit == null)
            {
                return JsonConvert.SerializeObject("Not found");

            }
            else
            {
                return JsonConvert.SerializeObject(produit);
            }
        }
    }

}

this is the Return string json that can't be serializable in my android application:

[
    "[{\"IdProduit\":1,\"NumeroSerie\":\"1234579657\",\"NomProduit\":\"Puce BigKing\",\"Prix\":200.0,\"Quantite\":500,\"IdModel\":1,\"IdModelNavigation\":{\"IdModel\":1,\"NomModel\":\"Puces\",\"Produit\":[],\"StockModel\":[]}},{\"IdProduit\":2,\"NumeroSerie\":\"12345687\",\"NomProduit\":\"Puce La Win\",\"Prix\":2000.0,\"Quantite\":60,\"IdModel\":1,\"IdModelNavigation\":{\"IdModel\":1,\"NomModel\":\"Puces\",\"Produit\":[],\"StockModel\":[]}},{\"IdProduit\":3,\"NumeroSerie\":\"124576328\",\"NomProduit\":\"Carte De Recharge 200DA\",\"Prix\":200.0,\"Quantite\":300,\"IdModel\":2,\"IdModelNavigation\":{\"IdModel\":2,\"NomModel\":\"Carte De Recharge\",\"Produit\":[],\"StockModel\":[]}}]"
]

expeted json in this return function must be lik this so this is a json array ofobjr=ect not an array of string for that my app does not serialze it properly;

[
   [
      {
         "IdProduit":1,
         "NumeroSerie":"1234579657",
         "NomProduit":"Puce BigKing",
         "Prix":200.0,
         "Quantite":500,
         "IdModel":1,
         "IdModelNavigation":{
            "IdModel":1,
            "NomModel":"Puces",
            "Produit":[

            ],
            "StockModel":[

            ]
         }
      },
      {
         "IdProduit":2,
         "NumeroSerie":"12345687",
         "NomProduit":"Puce La Win",
         "Prix":2000.0,
         "Quantite":60,
         "IdModel":1,
         "IdModelNavigation":{
            "IdModel":1,
            "NomModel":"Puces",
            "Produit":[

            ],
            "StockModel":[

            ]
         }
      }
     
   ]
]

Upvotes: 0

Views: 515

Answers (1)

Guru Stron
Guru Stron

Reputation: 142123

Change your return type to IEnumerable<Produit>:

 public IEnumerable<Produit> Get()
    {
        using (dbcontext)
        {
            var produit = dbcontext.Produit.Include("Liste produit")
                  .Select(s => new Produit
                  {
                      IdProduit=s.IdProduit,
                      NumeroSerie =s.NumeroSerie,
                      NomProduit=s.NomProduit,
                      Prix=s.Prix,
                      Quantite=s.Quantite,
                      IdModel=s.IdModel,
                      IdModelNavigation=s.IdModelNavigation

                  }).ToList();
              return produit;
        }
    }

ASP will serialize the result for you, otherwise you will get your result serialized twice.

Currently you serialize your collection into string with JsonConvert.SerializeObject(produit) and return IEnumerable<String> from your controller so you end up with collection of one string (via yield return) which is serialized ending up in the result in question.

UPD

To get desired output try this:

public IEnumerable<List<Produit>> Get()
{
    using (dbcontext)
    {
        var produit = dbcontext.Produit.Include("Liste produit")
              .Select(s => new Produit
              {
                  IdProduit=s.IdProduit,
                  NumeroSerie =s.NumeroSerie,
                  NomProduit=s.NomProduit,
                  Prix=s.Prix,
                  Quantite=s.Quantite,
                  IdModel=s.IdModel,
                  IdModelNavigation=s.IdModelNavigation

              }).ToList();
          return new [] { produit };
    }
}

Upvotes: 1

Related Questions