C#JSON将字典序列化为{key:value,…}而不是{key:key,value:value,…}
是否可以使用以下格式的DataContractJsonSerializer将.Net字典序列化为JSON:C#JSON将字典序列化为{key:value,…}而不是{key:key,value:value,…},c#,json,serialization,dictionary,C#,Json,Serialization,Dictionary,是否可以使用以下格式的DataContractJsonSerializer将.Net字典序列化为JSON: { key0:value0, key1:value1, ... } 我使用字典,因为并没有预定义的输入结构 我只是对DataContractJsonSerializer结果感兴趣!我已经找到了一个“代理”示例,但是在输出中有一个额外的“数据”,如果字典是,转义也为false 我已经找到了解决方案,多么需要的解决方案!首先,一个可序列化的“dictionary”类: (当然,
{
key0:value0,
key1:value1,
...
}
我使用字典,因为并没有预定义的输入结构
我只是对DataContractJsonSerializer结果感兴趣!我已经找到了一个“代理”示例,但是在输出中有一个额外的“数据”,如果字典是,转义也为false
我已经找到了解决方案,多么需要的解决方案!首先,一个可序列化的“dictionary”类: (当然,此示例仅以一种方式工作,但我不需要反序列化)
不幸的是,这在最新版本的DataContractJsonSerializer中目前不可能实现。见: 当前建议的解决方法是使用上面建议的JavaScriptSerializer
祝你好运 我在这段代码中使用了开箱即用的MVC4(注意
ToDictionary
中的两个参数)
我得到了预期的结果:
{"partials":{"cartSummary":"\u003cb\u003eCART SUMMARY\u003c/b\u003e"}}
重要提示:MVC4中的WebAPI使用现成的JSON.NET序列化,但标准的web
JsonResult
action result不使用。因此,我建议使用自定义ActionResult强制JSON.NET序列化。你也可以得到很好的格式
下面是一个简单的actionresultJsonNetResult
序列化日期时,您将看到不同之处(并确保使用的是正确的日期):
Microsoft方式:
{"wireTime":"\/Date(1355627201572)\/"}
JSON.NET方式:
{"wireTime":"2012-12-15T19:07:03.5247384-08:00"}
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"
// }
字典值=新字典();
添加(“键1”、“值1”);
添加(“键2”、“值2”);
字符串json=JsonConvert.SerializeObject(值);
// {
//“键1”:“值1”,
//“键2”:“值2”
// }
更多示例:在
DataContractJsonSerializer
上使用属性使用SimpleDictionaryFormat
,并将其设置为true
做这个工作:)MyJsonDictionary类对我来说工作得很好,只是结果输出是XML编码的,所以“0”变成了“0030”。 我目前被困在.NET3.5上,和其他许多解决方案一样,许多其他解决方案对我来说都不可用。 “将图片颠倒过来”,我意识到我永远无法说服微软给我想要的格式,但是…
字符串json=XmlConvert.DecodeName(xmlencodedJson);
塔达
结果就是您所期望看到的——普通的人类可读的和非XML编码的。
在.NET 3.5中工作。在.NET 5及更高版本中,您只需编写:
using System;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
Dictionary<string, string> values = new();
values.Add("key1", "value1");
values.Add("key2", "value2");
string json = System.Text.Json.JsonSerializer.Serialize(values);
Console.WriteLine(json);
}
}
使用系统;
使用System.Collections.Generic;
公共课程
{
公共静态void Main()
{
字典值=new();
添加(“键1”、“值1”);
添加(“键2”、“值2”);
字符串json=System.Text.json.JsonSerializer.Serialize(值);
Console.WriteLine(json);
}
}
要获取{“key1”:“value1”,“key2”:“value2”}
没有外部依赖关系。是否有任何特定原因要限制为
DataContractJsonSerializer
?每次我进行比较(这是好几次:我非常“喜欢”我的序列化程序)时,这是最不受欢迎的.NET JSON工具;我总是看JavaScriptSerializer或JSON.NetIn,您在什么上下文中使用它?也就是说,这是一个WCF应用程序、ASP.NET应用程序或其他应用程序。您是以自己调用WriteObject的方式使用DataContractJsonSerilizer,还是某个框架为您这样做?您的帖子中不清楚的是,您希望字典中有一个JSON对象,其属性(及其值)是名称/值对。要么是错误的,要么是错误的,因为它不能是JSON数组,因为不能有一个JSON数组,其中数组中的每个元素都有不同的属性名。那么,你能清楚你想要的实际格式吗?有人想出了相反的办法吗?如中所示,如何让它正确地反序列化MyJsonDictionary
?。请编辑您的问题并添加答案,而不是实际添加答案,因为答案第二行应该是string values=JsonConvert.SerializeObject(values)代码>在序列化http响应时,如何为wcf的默认行为设置这些设置?对我很有用,谢谢!我必须使用config.Formatters.JsonFormatter.UseDataContractJsonSerializer=true代码>在WebApiConfig.cs
中。
{"wireTime":"\/Date(1355627201572)\/"}
{"wireTime":"2012-12-15T19:07:03.5247384-08:00"}
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"
// }
using System;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
Dictionary<string, string> values = new();
values.Add("key1", "value1");
values.Add("key2", "value2");
string json = System.Text.Json.JsonSerializer.Serialize(values);
Console.WriteLine(json);
}
}