首页 > 解决方案 > 有没有办法在对象的 JSON 表示中从模型中动态切换字段?

问题描述

我有一个对象的 JSON 表示以及下面列出的相关模型类。这两个类MinionSettingsLeeSettings是从基本抽象泛型类派生的类。

{
    "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 中提取的,然后放入一个相关的对象中,该对象基于派生类(如两个类MinionSettingsLeeSettings

{
   "charSetting":[
      {
         "key":"minionSettings",
         "value":[
            1,
            12,
            3
         ]
      },
      {
         "key":"leeSettings",
         "value":[
            {
               "baseAD":1,
               "baseAP":1,
               "visible":true
            }
         ]
      }
   ]
}

标签: c#jsonjson.net

解决方案


JObject您可以纯粹通过使用and对象来解决这个问题,JArray而无需创建和使用任何域对象。

在下面的代码中,我假设节点存在(为了保持代码简单),但在生产代码中,请更喜欢TryGetValueRef)而不是索引运算符(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
        }
      ]
    }
  ]
}

推荐阅读