我有以下C#代码:
using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
public class Program
{
private static readonly JsonSerializerSettings prettyJson = new JsonSerializerSettings()
{
ContractResolver = new CamelCasePropertyNamesContractResolver(),
Formatting = Formatting.Indented
};
public class dialup {
public Dictionary<string,uint> speeds;
public string phonenumber;
}
public class Ethernet {
public string speed;
}
public class ipv4 {
public bool somecapability;
}
public class SiteData {
public string SiteName;
[JsonExtensionData]
public Dictionary<string, object> ConnectionTypes;
}
public static void Main()
{
var data = new SiteData()
{
SiteName = "Foo",
ConnectionTypes = new Dictionary<string, object>()
{
{ "1", new dialup() { speeds=new Dictionary<string,uint>() {{"1",9600},{"2",115200}}, phonenumber = "0118 999 881 999 119 725 ... 3" } },
{ "2", new Ethernet() { speed = "1000" } },
{"3", new ipv4() { somecapability=true}}
}
};
var json = JsonConvert.SerializeObject(data, prettyJson);
Console.WriteLine(json);
}
}
这将导致以下JSON:
{
"siteName": "Foo",
"1": {
"speeds": {
"1": 9600,
"2": 115200
},
"phonenumber": "0118 999 881 999 119 725 ... 3"
},
"2": {
"speed": "1000"
},
"3": {
"somecapability": true
}
}
我在JSON中需要的是:
{
"siteName": "Foo",
"1": {
"dialup":{
"speeds": {
"1": 9600,
"2": 115200
},
"phonenumber": "0118 999 881 999 119 725 ... 3"
}
},
"2": {
"Ethernet":{
"speed": "1000"
}
},
"3": {
"ipv4":{
"somecapability": true
}
}
}
如何使用json.net执行此操作?JSON.NET可以将其化为很好,但是我一直在寻找如何以相同方式序列化的几天。
要实现这一目标,您需要在另一个字典中包装 ConnectionTypes
字典中的每个值。您可以创建一个辅助方法以使其更容易:
private static Dictionary<string, object> WrapInDictionary(object value)
{
return new Dictionary<string, object>()
{
{ value.GetType().Name, value }
};
}
然后您可以这样初始化数据:
var data = new SiteData()
{
SiteName = "Foo",
ConnectionTypes = new Dictionary<string, object>()
{
{ "1", WrapInDictionary( new dialup() { Speeds = new Dictionary<string, uint>() { {"1", 9600}, {"2", 115200} }, PhoneNumber = "0118 999 881 999 119 725 ... 3" } ) },
{ "2", WrapInDictionary( new Ethernet() { Speed = "1000" } ) },
{ "3", WrapInDictionary( new ipv4() { SomeCapability=true } ) }
}
};
小提琴:https://dotnetfiddle.net/ggxldo