首页 > 解决方案 > 在 Unity 中使用 Json.NET 序列化和反序列化具有任意字段的对象

问题描述

我想序列化和反序列化具有任意字段的对象。我试图让具有任意字段的对象扩展Dictionary<string, object>,希望能够将任意字段设置为字典条目。在这种情况下,除了 and 字段之外,我希望在 json 响应(在代码注释中列出)Company中包含and 。不幸的是,我能够获得任意字段,但无法获得非任意字段。Positionmanageroffice

我还希望能够添加任意对象,而不仅仅是字符串(即在工作中添加带有基本工资、奖金等的工资对象)。我也有一些限制,不能dynamic用于此。

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public Job Job { get; set; }
}

public class Job : Dictionary<string, object>
{
    public string Company { get; set; }
    public string Position { get; set; }
}

var job = new Job()
{
    Company = "Super Mart",
    Position = "Cashier"
};

// Set arbitrary fields
job["manager"] = "Kathy";
job["office"] = "001";

var john = new Person()
{
    Name = "John Doe",
    Age = 41,
    Job = job
};

var employeeJson = JsonConvert.SerializeObject(john, Formatting.Indented);
Log.Debug("TestSerialization", "json: {0}", employeeJson);
// Result
// {
//   "Name": "John Doe",
//   "Age": 41,
//   "Job": {
//     "manager": "Kathy",
//     "office": "001"
//   }
// }

var johnDoe = JsonConvert.DeserializeObject<Person>(employeeJson);
Log.Debug("TestSerialization", "name: {0}, age: {1}", johnDoe.Name, johnDoe.Age);
// Result
// name: John Doe, age: 41

Log.Debug("TestSerialization", "company: {0}, position: {1}", johnDoe.Job.Company, johnDoe.Job.Position);
// Result
// company: , position:

Log.Debug("TestSerialization", "manager: {0}, office: {1}", johnDoe.Job["manager"], johnDoe.Job["office"]);
// Result
// manager: Kathy, office: 001

我使用此代码反序列化的结果 json 是

{
  "Name": "John Doe",
  "Age": 41,
  "Job": {
    "manager": "Kathy",
    "office": "001"
  }
}

我希望结果 json 是(服务所期望的)

{
  "Name": "John Doe",
  "Age": 41,
  "Job": {
    "Company" = "Super Mart",
    "Position" = "Cashier"
    "manager": "Kathy",
    "office": "001"
  }
}

标签: c#jsonunity3d

解决方案


我认为你的工作类的问题,它来自字典,所以当你序列化它时不会考虑它的成员。只有字典值,

试试这种方式,我不确定这会帮助你的上下文

public class Job 
{
    public string Company { get; set; }
    public string Position { get; set; }
    public Dictionary<string,object> job { get; set; }

    public Job()
    {
        job = new Dictionary<string, object>();
    }
}

Debug.Log(johnDoe.Job.job["manager"]+"-"+ johnDoe.Job.job["office"]);


推荐阅读