c# - 有没有办法在对象的 JSON 表示中从模型中动态切换字段?
问题描述
我有一个对象的 JSON 表示以及下面列出的相关模型类。这两个类MinionSettings
和LeeSettings
是从基本抽象泛型类派生的类。
{
"charSetting": {
"minionSettings": {
"key": "minionSettings",
"value": [1,2,3]
},
"leeSettings": {
"key": "leeSettings",
"value": [
{
"baseAD": 1,
"baseAP": 1,
"visible": true
}
]
}
}
}
public class CharacterSettingsWrapper
{
public CharacterSettings CharSetting { get; set; }
}
public class CharacterSettings
{
public MinionSettings MinionSettings { get; set; }
public LeeSettings LeeSettings { get; set; }
}
[DataContract]
public class MinionSettings : CharacterSetting<List<int>>
{
public MinionSettings()
{
Key = "minionSettings";
Value = new List<int>();
}
}
public class LeeSettings : CharacterSetting<List<LeeSetting>>
{
public LeeSettings()
{
Key = "leeSettings";
Value = new List<LeeSetting>();
}
}
有什么方法可以保留CharacterSettings
类中的所有字段,但将它们从对象的 JSON 表示中删除,同时保留相关的键/值对,所以我希望 JSON 如下所示。如果没有,我还能做些什么来实现这一目标?
我已经尝试使用我的基本抽象类,但由于它是抽象的,我无法创建它的实例,所以它不能很好地工作,并且这些数据是从 JSON 中提取的,然后放入一个相关的对象中,该对象基于派生类(如两个类MinionSettings
和LeeSettings
)
{
"charSetting":[
{
"key":"minionSettings",
"value":[
1,
12,
3
]
},
{
"key":"leeSettings",
"value":[
{
"baseAD":1,
"baseAP":1,
"visible":true
}
]
}
]
}
解决方案
JObject
您可以纯粹通过使用and对象来解决这个问题,JArray
而无需创建和使用任何域对象。
在下面的代码中,我假设节点存在(为了保持代码简单),但在生产代码中,请更喜欢TryGetValue
(Ref)而不是索引运算符(Ref)。
//Retrieve the nodes from the original json
var json = File.ReadAllText("sample.json");
var root = JObject.Parse(json);
var charSetting = root["charSetting"];
var minionSettings = charSetting["minionSettings"];
var leeSettings = charSetting["leeSettings"];
//Construct the new json based on the retrieved values
var newcharSetting = new JArray();
newcharSetting.Add(minionSettings);
newcharSetting.Add(leeSettings);
var newRoot = new JObject();
newRoot.Add("charSetting", newcharSetting);
Console.WriteLine(newRoot.ToString());
我还必须提到,这段代码很大程度上依赖于示例 json 的结构。因此,处理任何与此类似的结构都不够通用。
打印输出如下所示:
{
"charSetting": [
{
"key": "minionSettings",
"value": [
1,
2,
3
]
},
{
"key": "leeSettings",
"value": [
{
"baseAD": 1,
"baseAP": 1,
"visible": true
}
]
}
]
}
推荐阅读
- javascript - 如何防止倒数计时器跳过第一秒?
- tkinter - Tkinter 树视图调整树视图的大小以适合屏幕
- python - 死简单示例中的线程锁定失败
- python - 尝试使用 Python 中的 beautifulsoup 从网页构建结果列表
- python-xarray - xarray map (apply) 在指定 keep_attrs 时出错
- c - C 代码错误:迭代内存指针时 EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
- javascript - 有没有办法将 SVG 文件添加为内联?
- flutter - Flutter 每次用户打开应用程序时显示一个页面,直到他们单击一个按钮,然后当他们打开应用程序时它应该显示一个不同的页面
- c++ - 我不断收到“缺少类型说明符”错误 C4430
- sql - 用于创建表的 SQL ETL - 求职面试问题