c# - 将 JSON 文件序列化为类和字典
问题描述
我的类结构是固定的,但对象变量(属性)不固定。这些数据是可配置的。我正在用字典创建一个类,但它不起作用。
例如。
{
"datamapItems": [
{
"paramName": "VE8321C",
"datamapKey": {
"module": 1,
"id": 1391
},
"min": "0",
"max": "40",
"default": 222,
"rateHz": 0,
"timeoutMs": 0,
"dataType": "uint16"
}
]
}
对于这些 JSON 结构,我们创建了以下类结构。但它不工作。序列化后的字典不包含任何值。
public class Datamap
{
[JsonProperty("datamapItems")]
public List<DatamapItem> datamapItems { get; set; }
}
public class DatamapItem
{
public Dictionary<object, object> datamapitems = new Dictionary<object, object>();
public DatamapKey datamapKey { get; set; }
}
public class DatamapKey
{
public Dictionary<object, object> datamapitems = new Dictionary<object, object>();
}
解决方案
如果您的对象不是固定的并且数据必须是可配置的,那么Newtonsoft.json
这里有一个可以使用的特性,那就是[JsonExtensionData]
. 阅读更多
现在在序列化对象时写入扩展数据。读取和写入扩展数据可以自动往返所有 JSON,而无需将每个属性添加到您要反序列化的 .NET 类型。只声明您感兴趣的属性,让扩展数据完成其余的工作。
在这里,我为您的演示目的创建了一个控制台应用程序。
class Program
{
static void Main(string[] args)
{
//This is your input json string
var inputJson = @"{
'datamapItems': [
{
'paramName': 'VE8321C',
'datamapKey': {
'module': 1,
'id': 1391
},
'min': '0',
'max': '40',
'default': 222,
'rateHz': 0,
'timeoutMs': 0,
'dataType': 'uint16'
}
]
}";
var result = JsonConvert.DeserializeObject<Datamap>(inputJson); //Here you can deserialize your json
DatamapKey datamapKey = new DatamapKey();
datamapKey._DatamapKeys = new Dictionary<string, JToken>();
datamapKey._DatamapKeys.Add("module", 1);
datamapKey._DatamapKeys.Add("id", 1391);
datamapKey._DatamapKeys.Add("ABC", 123); //Here I added extra key/value pair to your inner object
DatamapItem datamapItem = new DatamapItem();
datamapItem._DatamapItems = new Dictionary<string, JToken>();
datamapItem._DatamapItems.Add("paramName", "VE8321C");
datamapItem._DatamapItems.Add("datamapKey", JToken.FromObject(datamapKey));
datamapItem._DatamapItems.Add("min", "0");
datamapItem._DatamapItems.Add("max", "40");
datamapItem._DatamapItems.Add("default", 222);
datamapItem._DatamapItems.Add("rateHz", 0);
datamapItem._DatamapItems.Add("timeoutMs", 0);
datamapItem._DatamapItems.Add("dataType", "uint16");
datamapItem._DatamapItems.Add("PQR", "123"); //Here I added extra key/value pair to your outer object
datamapItem._DatamapItems.Add("XYZ", "123"); //Here I added extra key/value pair to your outer object
Datamap datamap = new Datamap();
datamap.datamapItems = new List<DatamapItem>();
datamap.datamapItems.Add(datamapItem);
string json = JsonConvert.SerializeObject(datamap); //Here you can serialize your custom key/value pair
JObject parsed = JObject.Parse(json);
Console.WriteLine(parsed);
Console.ReadLine();
}
}
public class DatamapKey
{
[JsonExtensionData]
public IDictionary<string, JToken> _DatamapKeys;
}
public class DatamapItem
{
[JsonExtensionData]
public IDictionary<string, JToken> _DatamapItems;
}
public class Datamap
{
public List<DatamapItem> datamapItems { get; set; }
}
输出:
编辑:
1)对于以下json
{ "agentRegistry": { "agents": [ { "type": "drv", "id": "drv3", "port": 3, "config": { "mode": "currentSetPoint", "config": { } } }, { "type": "mmc", "id": "mmc2", "port": 2, "config": { "mode": "analogIn", "config": { "max": 21000, "min": 300, "conversion": [ ] } }}]}}
课程:
public class Config2
{
[JsonExtensionData]
public IDictionary<string, JToken> _config2;
}
public class Config
{
[JsonExtensionData]
public IDictionary<string, JToken> _config;
}
public class Agent
{
[JsonExtensionData]
public IDictionary<string, JToken> _agents;
}
public class AgentRegistry
{
public List<Agent> agents { get; set; }
}
public class RootObj
{
public AgentRegistry agentRegistry { get; set; }
}
推荐阅读
- ios - 如何将启动屏幕状态栏颜色设置为白色?
- html - 删除表格中两行小按钮之间的空格
- regex - 用 CL-PPCRE 匹配行尾
- spring - HttpSecurity 配置不适用于 Spring 上的 Keycloak 适配器
- python - for 循环执行
- python - 导入脚本时如何在函数之间传递变量,sense self.function 在导入代码时不起作用
- amazon-ec2 - 无法在 AWS ssh 中建立主机的真实性
- java - 如何使用 Queue 元素填充 ComboBox?
- node.js - Node js socket.io 需要验证请求和服务器响应
- c# - XPATH 搜索下一个节点