Eu estou desenvolvendo um WebService que excecute linq parasql db e colocar os resultados em uma variável VAR. Então eu quero serializar o resultado dentro do formato VAR para json usando o serializador javascript (c #). Algo assim:
var sb= from p in ent.people .........
System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(sb.GetType());
MemoryStream ms = new MemoryStream();
serializer.WriteObject(ms, sb);
string json = System.Text.Encoding.Default.GetString(ms.ToArray());
Mas eu recebo uma resposta de erro como isto:
Type 'System.Data.Objects.ObjectQuery`1[<>f__AnonymousType2d`5[System.String,System.Nu llable`1[System.Int32],System.Nullable`1[System.Int32],System.Int32,System.String]]' cannot be serialized.
Considere marcá-lo com oAtributo DataContractAttribute e marcando todos os seus membros que você deseja serializados com o atributo DataMemberAttribute. Se o tipo for uma coleção, considere marcá-lo com o CollectionDataContractAttribute. Consulte a documentação do Microsoft .NET Framework para outros tipos suportados.
COMO POSSO SUSTENTABILAR OS RESULTADOS DO LINQ DIRETAMENTE AO JSON ?? Muito obrigado por todas as respostas! Enrico
Respostas:
4 para resposta № 1O DataContractJsonSerializer não suporta objetos anônimos. Se você deseja serializar objetos anônimos, pode usar o JavaScriptSerializer classe:
var sb = from p in ent.people .........
var serializer = new JavaScriptSerializer();
string json = serializer.Serialize(sb);
0 para resposta № 2
No meu último trabalho, vimos esse comportamento e demorou um pouco para contornar isso.
Primeiro, você quer o QI Toolkit, disponível emCodePlex gratuitamente. Em suas bibliotecas, há um "PartialEvaluator" que pode reduzir a complexidade de muitas árvores de expressão, encontrando nós que sempre avaliam os nós mais simples e substituindo as referências a "closures externos" por constantes. Você vai querer executar o seu IQueryable através disso antes de tentar serializá-lo.
Então, para usar o JSON DataContractserializador, você deve configurar a classe que deseja serializar como um DataContract. Existem tutoriais para fazer isso em todo o lugar; basicamente você apenas decora a classe, quaisquer classes contidas e os membros que deseja serializar com atributos.
Depois de ter essas duas coisas em vigor, seu objeto e seu membro IQueryable devem ser serializáveis para JSON usando o DataContractJsonSerializer.
0 para resposta № 3
você pode usar Newtonsoft.JSON por isso
heres é a sintaxe
var sb = from p in ent.people .........
string json = JsonConvert.SerializeObject(sb);