Помогите с дизайном DataContract для моего сервиса WCF JSON - PullRequest
0 голосов
/ 09 августа 2011

Я пишу сервис WCF, который возвращает данные в формате JSON клиентам.Я хотел бы вывести JSON, который выглядит следующим образом:

{22877: {id: "22877", имя: "Foo Bar", тип: "пользователь", действия: {data: []}} 405564:{id: "405564", имя: "Bar Foo", тип: "пользователь", действия: {data: []}}}

Мне трудно найти класс /DataContract, который будет сериализован в вышеуказанный формат службой JSON WCF.

Я попробовал следующее

[DataContract]
internal class Person
{
    [DataMember]
    internal string id;

    [DataMember]
    internal string name;

    [DataMember]
    internal string type;

    [DataMember]
    internal Activities activities;
}

[DataContract]
internal class Activities
{
    [DataMember(Name = "data")]
    internal List<Activity> activity;
}

[DataContract]
internal class Activity
{
    internal string name;
}

Когда я возвращаю List of Persons из моего метода WCF, ответ JSON выглядит следующим образом

[{"activity": {"data": [{}]}, "id": "1234", "name": "John", "type": "user"}, {"деятельности ": {" данные ": [{}]}," идентификатор ":" 1234 "," имя ":" Джон "," тип ":" пользователь "}]

Любые предложения о том, какполучить «id» (который является динамическим) в качестве ключа для каждого из внутренних объектов JSON и иметь {} скобки для коллекции элементов вместо []?

1 Ответ

1 голос
/ 09 августа 2011

DataContractJsonSerializer (DCJS) сможет только сериализовать (и десериализовать) граф объектов, который следует определенной схеме.Данные, которые вы хотите сериализовать, не делают этого, поэтому DCJS не может использоваться для этого напрямую.

Однако вы можете использовать одну вещь - нетипизированную поддержку JSON, которую вы можете получить из проекта codeplex по адресу http://wcf.codeplex.com (загрузка «Поддержка WCF для jQuery»).Вы можете найти дополнительную информацию на сайте codeplex или по адресу http://blogs.msdn.com/b/carlosfigueira/archive/2010/10/29/working-with-untyped-json-in-a-wcf-service.aspx.

. Приведенный ниже код показывает, как сериализовать данные в нужном формате;с новым поведением из проекта codeplex (WebHttpBehavior3) вы можете иметь класс JsonObject в качестве типа возврата для ваших операций.

public class StackOverflow_6990927
{
    [DataContract]
    internal class Person
    {
        [DataMember]
        internal string id;
        [DataMember]
        internal string name;
        [DataMember]
        internal string type;
        [DataMember]
        internal Activities activities;
    }
    [DataContract]
    internal class Activities
    {
        [DataMember(Name = "data")]
        internal List<Activity> activity;
    }
    [DataContract]
    internal class Activity
    {
        [DataMember]
        public string name;
    }
    public static void Test()
    {
        Activities noActivities = new Activities { activity = new List<Activity>() };
        Activities someActivities = new Activities
        {
            activity = new List<Activity>
            {
                new Activity { name = "hiking" },
            }
        };
        Person[] people = new Person[]
        {
            new Person { id = "22877", name = "Foo Bar", type = "user", activities = noActivities },
            new Person { id = "405564", name = "Bar Foo", type = "user", activities = someActivities },
        };
        JsonObject jo = new JsonObject(people.Select(x => new KeyValuePair<string, JsonValue>(x.id, JsonValueExtensions.CreateFrom(x))));
        Console.WriteLine(jo);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...