.NET: Могу ли я использовать DataContractJsonSerializer для сериализации в ассоциативный массив JSON? - PullRequest
2 голосов
/ 13 мая 2010

При использовании DataContractJsonSerializer для сериализации словаря, например так:

[CollectionDataContract]
public class Clazz : Dictionary<String,String> {}

    ....

    var c1 = new Clazz();
    c1["Red"] = "Rosso";
    c1["Blue"] = "Blu";
    c1["Green"] = "Verde";

Сериализация c1 с этим кодом:

    var dcjs = new DataContractJsonSerializer(c1.GetType());
    var json = new Func<String>(() =>
        {
            using (var ms = new System.IO.MemoryStream())
            {
                    dcjs.WriteObject(ms, c1);
                    return Encoding.ASCII.GetString(ms.ToArray());
            }
        })();

... производит этот JSON:

[{"Key":"Red","Value":"Rosso"},
 {"Key":"Blue","Value":"Blu"},
 {"Key":"Green","Value":"Verde"}]

Но это не ассоциативный массив Javascript. Если я сделаю соответствующую вещь в javascript: создайте словарь, а затем сериализуйте его так:

var a = {};
a["Red"] = "Rosso";
a["Blue"] = "Blu";
a["Green"] = "Verde";

// use utility class from http://www.JSON.org/json2.js
var json = JSON.stringify(a);

Результат:

{"Red":"Rosso","Blue":"Blu","Green":"Verde"}

Как заставить DCJS создавать или использовать сериализованную строку для словаря, совместимого с JSON2.js ?


Я знаю о JavaScriptSerializer из ASP.NET. Не уверен, что это очень дружелюбно к WCF. Относится ли это к атрибутам DataMember, DataContract?

Ответы [ 2 ]

2 голосов
/ 13 мая 2010

То, что он делает, совершенно разумно, JSON, который он создает, является разумным представлением словаря .net в JSON. Если вы хотите описанный вами вывод JSON, вам нужно сериализовать класс, подобный

public class ColourThingy
{
      public string Red {get;set;}
      public string Blue {get;set;}
      public string Green {get;set;}
}
ColourThingy MyColourThingy = new ColourThingy();
MyColourThingy.Red = "Rosso";
...

Помните, что ассоциативные массивы JavaScript на самом деле не являются массивами, вы просто используете тот факт, что object ["key"] является еще одним способом ссылки на object.key. Таким образом, когда он сериализует словарь .net в JSON, он создает массив объектов пары ключ / значение в точности так, как вы ожидаете.

0 голосов
/ 13 мая 2010

Я поднял ошибка в MS Connect для поведения, описанного выше .

Пожалуйста, проголосуйте.

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