Сериализация результатов Linq непосредственно в JSON - PullRequest
5 голосов
/ 18 октября 2011

Я разрабатываю WebService, который использует linq to sql db и помещает результаты в переменную VAR.Затем я хочу сериализовать результат внутри VAR в формат json, используя javascript serializer (c #).Примерно так:

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

НО Я ПОЛУЧАЮ ОТВЕТ НА ОШИБКУ, КАК ЭТО:

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. 

Попробуйте пометить его атрибутом DataContractAttribute и отметить все его элементы, которые вы хотите сериализовать, сАтрибут DataMemberAttribute.Если тип является коллекцией, попробуйте пометить его с помощью CollectionDataContractAttribute.Сведения о других поддерживаемых типах см. В документации по Microsoft .NET Framework.

КАК МОЖНО СЕРИАЛИЗИРОВАТЬ РЕЗУЛЬТАТЫ LINQ НАПРЯМУЮ В JSON ??Большое спасибо за все ответы!Enrico

Ответы [ 3 ]

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

DataContractJsonSerializer не поддерживает анонимные объекты.Если вы хотите сериализовать анонимные объекты, вы можете использовать класс JavaScriptSerializer :

var sb = from p in ent.people .........
var serializer = new JavaScriptSerializer();
string json = serializer.Serialize(sb);
2 голосов
/ 06 июля 2018

вы можете использовать Newtonsoft.JSON для этого

вот синтаксис

var sb = from p in ent.people .........
string json = JsonConvert.SerializeObject(sb);
0 голосов
/ 18 октября 2011

На моей последней работе мы видели это поведение, и потребовалось немало усилий, чтобы обойти его.

Во-первых, вам нужен IQ Toolkit, доступный в CodePlex бесплатно.В его библиотеках есть «PartialEvaluator», который может уменьшить сложность многих деревьев выражений, находя узлы, которые всегда оцениваются на более простые узлы, и заменяя ссылки на «внешние замыкания» константами.Прежде чем пытаться его сериализовать, вы захотите запустить свой IQueryable.

Затем, чтобы использовать сериализатор JSON DataContract, вы должны настроить класс, который вы хотите сериализовать, как DataContract.Есть учебники для того, чтобы сделать это повсюду;в основном вы просто декорируете класс, любые содержащиеся в нем классы и члены, которые хотите сериализовать, с помощью атрибутов.

После того, как эти две вещи на месте, ваш объект и его член IQueryable должны быть сериализованы в JSON с использованиемDataContractJsonSerializer.

...