С# JSON Сериализация словаря в {key: value,...} вместо {key: key, value: value,...}
Можно ли сериализовать .Net Dictionary < Key, Value > в JSON с DataContractJsonSerializer, который имеет формат:
{
key0:value0,
key1:value1,
...
}
Я использую Dictionary < K, V > , потому что не существует предопределенной структуры входов.
Мне интересно только для результата DataContractJsonSerializer! Я уже нашел пример "Surrogate", но есть дополнительные "данные" на выходе, и если словарь < K, String > is, escape также является ложным.
Я нашел решение, что нужно! Прежде всего, сериализуемый "словарь" класс:
(Конечно, этот пример работает только одним способом, но мне не нужна десериализация)
[Serializable]
public class MyJsonDictionary<K, V> : ISerializable {
Dictionary<K, V> dict = new Dictionary<K, V>();
public MyJsonDictionary() { }
protected MyJsonDictionary( SerializationInfo info, StreamingContext context ) {
throw new NotImplementedException();
}
public void GetObjectData( SerializationInfo info, StreamingContext context ) {
foreach( K key in dict.Keys ) {
info.AddValue( key.ToString(), dict[ key ] );
}
}
public void Add( K key, V value ) {
dict.Add( key, value );
}
public V this[ K index ] {
set { dict[ index ] = value; }
get { return dict[ index ]; }
}
}
Использование:
public class MainClass {
public static String Serialize( Object data ) {
var serializer = new DataContractJsonSerializer( data.GetType() );
var ms = new MemoryStream();
serializer.WriteObject( ms, data );
return Encoding.UTF8.GetString( ms.ToArray() );
}
public static void Main() {
MyJsonDictionary<String, Object> result = new MyJsonDictionary<String, Object>();
result["foo"] = "bar";
result["Name"] = "John Doe";
result["Age"] = 32;
MyJsonDictionary<String, Object> address = new MyJsonDictionary<String, Object>();
result["Address"] = address;
address["Street"] = "30 Rockefeller Plaza";
address["City"] = "New York City";
address["State"] = "NY";
Console.WriteLine( Serialize( result ) );
Console.ReadLine();
}
}
И результат:
{
"foo":"bar",
"Name":"John Doe",
"Age":32,
"Address":{
"__type":"MyJsonDictionaryOfstringanyType:#Json_Dictionary_Test",
"Street":"30 Rockefeller Plaza",
"City":"New York City",
"State":"NY"
}
}
Ответы
Ответ 1
Json.NET делает это...
Dictionary<string, string> values = new Dictionary<string, string>();
values.Add("key1", "value1");
values.Add("key2", "value2");
string json = JsonConvert.SerializeObject(values);
// {
// "key1": "value1",
// "key2": "value2"
// }
Дополнительные примеры: Сериализация коллекций с помощью Json.NET
Ответ 2
используйте свойство UseSimpleDictionaryFormat
в DataContractJsonSerializer
и установите его на true
.
Выполняет ли это задание:)
Ответ 3
Я использую из коробки MVC4 с этим кодом (обратите внимание на два параметра внутри ToDictionary
)
var result = new JsonResult()
{
Data = new
{
partials = GetPartials(data.Partials).ToDictionary(x => x.Key, y=> y.Value)
}
};
Я получаю ожидаемое:
{"partials":{"cartSummary":"\u003cb\u003eCART SUMMARY\u003c/b\u003e"}}
Важное: WebAPI в MVC4 использует сериализацию JSON.NET из коробки, но результат работы с веб-сайтом JsonResult
не работает. Поэтому я рекомендую использовать пользовательский ActionResult для принудительной сериализации JSON.NET. Вы также можете получить красивое форматирование
Здесь простой actionresult JsonNetResult
http://james.newtonking.com/archive/2008/10/16/asp-net-mvc-and-json-net.aspx
При сериализации даты вы увидите разницу (и можете убедиться, что используете правильный):
Способ Microsoft:
{"wireTime":"\/Date(1355627201572)\/"}
Способ JSON.NET:
{"wireTime":"2012-12-15T19:07:03.5247384-08:00"}
Ответ 4
К сожалению, в последней версии DataContractJsonSerializer это невозможно. См.: http://connect.microsoft.com/VisualStudio/feedback/details/558686/datacontractjsonserializer-should-serialize-dictionary-k-v-as-a-json-associative-array
В настоящее время предлагается использовать JavaScriptSerializer, как указано выше.
Удачи!