从包含 2 个对象的 json 文件下载列表值

Download values of list from json file with 2 objects

我想创建简单的游戏,我需要从 json 获取值或更改它们。 我有 3 类.

public class Person
{
    public string Specjality { get; set; }
    public int PWZ { get; set; }
    public string Name { get; set; }
    public string Surname { get; set; }
    public List<string> Items { get; set; }
}

public class Monster
{
    public string Name { get; set; }
    public List<string> Skills { get; set; }
}

public class Root
{
    public List<Person> people { get; set; }
    public List<Monster> monsters { get; set; }
}

Json 文件

{
  "Person": [
    {
      "Speciality": "Archer",
      "PWZ": 432742,
      "Name": "Charlie",
      "Surname": "Evans",
      "Items": [
        "Bow",
        "Arrow",
      ]
    },
    {
      "Speciality": "Soldier",
      "PWZ": 432534879,
      "Name": "Harry",
      "Surname": "Thomas",
      "Items": [
        "Gun",
        "Knife",
     ]
    }
  ],
  "Monster": [
    {
      "Name": "Papua",
      "Skills": [
        "Jump",
        "SlowWalk",
      ]
    },
    {
     "Name": "Geot",
      "Skills": [
        "Run",
        "Push",
      ]
    }
  ]
}

我的第一个问题是如何反序列化它,接下来如何在屏幕上打印选定的值(例如第一个怪物的技能)以及如何更改一些值(例如将“跳跃”从怪物技能更改为“传送” " 或更改人名)。感谢大家的回答。

你非常接近。要反序列化,请更新以下内容:

  1. Update/fix spelling/typo 在 Person class
    public string Speciality { get; set; }
    
  2. 更新 Root 属性 名称(名称应与 Json 匹配):
    public class Root
    {
        public List<Person> Person { get; set; }
        public List<Monster> Monster { get; set; }
    }
    
  3. 反序列化为 Root class:
    var result = JsonSerializer.Deserialize<Root>(json);
    

现在,Json 字符串中的尾随逗号也存在问题。我收到此错误:

The JSON array contains a trailing comma at the end which is not supported in this mode. Change the reader options.

您可以修复 Json 字符串(删除数组中的尾随逗号),或者如果您使用 System.Text.Json 反序列化,您可以应用 AllowTrailingCommas 选项:

var options = new JsonSerializerOptions { AllowTrailingCommas = true };
var result = JsonSerializer.Deserialize<Root>(json, options);

显示值:

// iterate over Person/Monster collection
foreach (var person in result.Person)
    Console.WriteLine($"Name: {person.Name}, Items: {string.Join(", ", person.Items)}");

foreach (var monster in result.Monster)
    Console.WriteLine($"Name: {monster.Name}, Skills: {string.Join(", ", monster.Skills)}");

修改 项目,您只需修改PersonMonster 实例,然后再次序列化:

// update name:
result.Person[0].Name = "Alan";
// serialize if you need to:
string json = JsonSerializer.Serialize(result);