Сериализация объектов Entity Framework в JSON - PullRequest
6 голосов
/ 17 октября 2011
public class GenericHandler : IHttpHandler
{
    public class ASSystem
    {
        public string SID { get; set; }
        public string Description { get; set; }
        public string SystemName { get; set; }
    }

    public class ErrorObj
    {
        public string ErrorMessage { get; set; }
    }

    public void ProcessRequest(HttpContext context)
    {
        HttpContext.Current.Response.ContentType = "application/json";
        HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;

        string query = HttpContext.Current.Request.QueryString["SID"];


        SOFAEntities ctx = new SOFAEntities();
        JavaScriptSerializer serializer = new JavaScriptSerializer();

        try
        {
            AS_SYSTEM system = ctx.AS_SYSTEM.Where(s => s.SYSTEM_ID == query).First() as AS_SYSTEM;

            if (system != null)
            {
                ASSystem sys = new ASSystem() { SID = system.SYSTEM_ID, Description = system.DESCRIPTION, SystemName = system.SYSTEM_NAME };
                HttpContext.Current.Response.Write(serializer.Serialize(sys));
            }
        }
        catch (Exception e)
        {
            HttpContext.Current.Response.Write(serializer.Serialize(new ErrorObj() { ErrorMessage = e.Message }));
        }





    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

Это работает, но когда я пытаюсь с HttpContext.Current.Response.Write(serializer.Serialize(system));, я получаю следующую ошибку:

При сериализации объекта типа обнаружена круговая ссылка «System.Data.Metadata.Edm.AssociationType

Мне нужен был объект json, представляющий полный объект as_system, поэтому мне не нужно вручную сопоставлять каждое свойство. Есть ли способ решить это? Спасибо!

Ответы [ 5 ]

5 голосов
/ 19 мая 2016

Если вы хотите сериализовать объекты Entity Framework в JSON, вы можете использовать JSON.NET из http://www.newtonsoft.com., чтобы сделать это, установить JSON.NET из nuget и использовать следующий пример кода:

return Newtonsoft.Json.JsonConvert.SerializeObject(results, Formatting.Indented, 
new JsonSerializerSettings { 
    ReferenceLoopHandling = ReferenceLoopHandling.Ignore 
});

ReferenceLoopHandling.Ignore может предотвратить ошибку циклического задания.

4 голосов
/ 17 октября 2011

Звучит так, как будто EF не дает вам ASSystem, а скорее какой-то тонкий динамический подкласс этого с некоторым EF Goo.Если это правильно, я бы сказал, что самое простое, что можно сделать здесь - это , чтобы использовать что-то вроде AutoMapper для получения копии не-EF (в экземпляр new ASSystem(), не тронутый EF)).Тем не менее, есть несколько альтернатив:

  • вы можете попробовать пометить ASSystem как sealed, лишив EF возможности внедрять себя
  • если вы пишете пользовательский конвертер и зарегистрируйте его - это, вероятно, больше работы, чем отображение, хотя
3 голосов
/ 17 октября 2011

Вы можете создать объект POCO, который может содержать ваши данные и может быть сериализован.Например, определите:

public class MySystem {
  public int SID {get; set;}
  public string Description {get; set;}
  public string SystemName {get; set;}
}

в вашем коде используйте этот оператор:

IQuerable<MySystem> sysList = from s in ctx.AS_SYSTEM where s.SYSTEM_ID == query 
                           select new MySystem(){SID = s.SYSTEM_ID,  
                           Description = s.Description, SystemName = s.SystemName   };
MySystem sys = sysList.First();

Теперь вы можете сериализовать sys, как в вашем примере.

0 голосов
/ 01 апреля 2014

попробуйте это;у меня это работает:

Чтобы вернуть данные Json [в EF]:

  1. добавить ссылку 'System.Runtime.Serialization' в проект
  2. написать код, напримерниже:

с использованием System.Web.Script.Serialization;

public string getValuesJson()
{
JavaScriptSerializer js = new JavaScriptSerializer();
MyDBEntities ctx = new MyDBEntities();

var myValues = (from m in ctx.TestEntity
               where (m.id == 22)
               select m).ToList();

 return js.Serialize(myValues);
}

вы также можете проверить, является ли строка Json допустимой или нет на http://jsonlint.com/

0 голосов
/ 17 октября 2011

Не уверен, поможет ли это, но попробуйте использовать DataContractJsonSerializer вместо JavaScriptSerializer. Насколько я знаю, DataContractJsonSerializer предпочтительнее JavaScriptSerializer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...