C# 如何在C中的JSONString中保存库存#

C# 如何在C中的JSONString中保存库存#,c#,json,list,C#,Json,List,所以今天我尝试为我的库存创建一个类,并向其中添加项目。我创建了两个类,一个包含我的库存:name、amount、slot,另一个包含列表list。但它总是显示与此代码相关的异常: public class Inventory { public string name { get; set; } public int amount { get; set; } public int slot { get; set; } } public class InventoryLis

所以今天我尝试为我的库存创建一个类,并向其中添加项目。我创建了两个类,一个包含我的库存:name、amount、slot,另一个包含列表
list
。但它总是显示与此代码相关的异常:

public class Inventory
{
    public string name { get; set; }
    public int amount { get; set; }
    public int slot { get; set; }
}

public class InventoryList
{
    public List<Inventory> invList = new List<Inventory>();
}
因此,首先,当我尝试获取列表中的项目时,会出现以下错误:

我想要的是:我想要一个清晰的JSON字符串,我可以用C#反序列化它。 我希望列表如下所示:

[
 {
  "name":"cheese",
  "amount":5,
  "slot":1,
 },
 {
  "name":"Bread",
  "amount":2,
  "slot":4,
 },
]
    class Program
{
    static void Main(string[] args)
    {
        Inventory inventory = new Inventory() { name = "cheese", amount = 5, slot = 1 };
        Inventory inventory2 = new Inventory() { name = "Bread", amount = 2, slot = 4 };
        var invList = new List<Inventory>()
        {
            inventory,
            inventory2
        };

        InventoryList inventoryList = new InventoryList() {invList = invList };

        var options = new JsonSerializerOptions()
        {
            WriteIndented = true
        };

        string jsonString = JsonSerializer.Serialize(inventoryList, options);
        Console.Write($"Serialized list {Environment.NewLine} {jsonString} {Environment.NewLine}");

        var list = JsonSerializer.Deserialize<InventoryList>(jsonString);
        Console.Write($"Deserialization completed");
    }
}

public class Inventory
{
    public string name { get; set; }
    public int amount { get; set; }
    public int slot { get; set; }
}

public class InventoryList
{
    public List<Inventory> invList { get; set; }
}

您基本上希望序列化/反序列化对象列表。下面是一个工作示例:

   Inventory inventory = new Inventory() { name = "cheese", amount = 5, slot = 1 };
        Inventory inventory2 = new Inventory() { name = "Bread", amount = 2, slot = 4 };
        var inventoryList = new List<Inventory>()
        {
            inventory,
            inventory2
        };

        var options = new JsonSerializerOptions()
        {
            WriteIndented = true
        };

        string jsonString = JsonSerializer.Serialize(inventoryList, options);
        Console.Write($"Serialized list {jsonString} {Environment.NewLine}");

        var list = JsonSerializer.Deserialize<List<Inventory>>(jsonString);
        Console.Write($"Deserialization completed");
Inventory Inventory=newinventory(){name=“cheese”,amount=5,slot=1};
存货清单2=新存货(){name=“Bread”,金额=2,插槽=4};
var inventoryList=新列表()
{
库存
目录2
};
var options=新的JsonSerializerOptions()
{
WriteIndended=true
};
字符串jsonString=JsonSerializer.Serialize(清单列表,选项);
Write($“序列化列表{jsonString}{Environment.NewLine}”);
var list=JsonSerializer.Deserialize(jsonString);
Console.Write($“反序列化已完成”);
结果:

上面的示例与您所说的需要的JSON结构相匹配。 如果您仍然需要对象包装器,它的工作原理如下:

[
 {
  "name":"cheese",
  "amount":5,
  "slot":1,
 },
 {
  "name":"Bread",
  "amount":2,
  "slot":4,
 },
]
    class Program
{
    static void Main(string[] args)
    {
        Inventory inventory = new Inventory() { name = "cheese", amount = 5, slot = 1 };
        Inventory inventory2 = new Inventory() { name = "Bread", amount = 2, slot = 4 };
        var invList = new List<Inventory>()
        {
            inventory,
            inventory2
        };

        InventoryList inventoryList = new InventoryList() {invList = invList };

        var options = new JsonSerializerOptions()
        {
            WriteIndented = true
        };

        string jsonString = JsonSerializer.Serialize(inventoryList, options);
        Console.Write($"Serialized list {Environment.NewLine} {jsonString} {Environment.NewLine}");

        var list = JsonSerializer.Deserialize<InventoryList>(jsonString);
        Console.Write($"Deserialization completed");
    }
}

public class Inventory
{
    public string name { get; set; }
    public int amount { get; set; }
    public int slot { get; set; }
}

public class InventoryList
{
    public List<Inventory> invList { get; set; }
}
类程序
{
静态void Main(字符串[]参数)
{
库存=新库存(){name=“cheese”,金额=5,插槽=1};
存货清单2=新存货(){name=“Bread”,金额=2,插槽=4};
var invList=新列表()
{
库存
目录2
};
InventoryList InventoryList=new InventoryList(){invList=invList};
var options=新的JsonSerializerOptions()
{
WriteIndended=true
};
字符串jsonString=JsonSerializer.Serialize(清单列表,选项);
Write($“序列化列表{Environment.NewLine}{jsonString}{Environment.NewLine}”);
var list=JsonSerializer.Deserialize(jsonString);
Console.Write($“反序列化已完成”);
}
}
公共类目录
{
公共字符串名称{get;set;}
公共整数金额{get;set;}
公共int槽{get;set;}
}
公共类清单
{
公共列表invList{get;set;}
}
请注意invList的更改。它现在是一个get/set属性。 但是,此包装将在json中添加另一层花括号:

结果:


您正在尝试反序列化库存类型,并将结果对象分配给库存列表

您可以从这个示例中学习(不同的json格式)

公共类目录
{
公共字符串名称{get;set;}
公共整数金额{get;set;}
公共int槽{get;set;}
}
公共类清单
{
公共列表invList{get;set;}
}
//样本1
InventoryList lInventory=新的InventoryList()
{
invList=新列表
{
新库存{name=“cheese”,金额=5,插槽=1},
新库存{name=“Bread”,数量=2,插槽=4}
}
};
//它将产生
//{“invList”:[{“name”:“cheese”,“amount”:5,“slot”:1},{“name”:“Bread”,“amount”:2,“slot”:4}]}
字符串jsonString=JsonSerializer.Serialize(lInventory);
//如何反序列化
InventoryList InventoryList=(InventoryList)JsonSerializer.Deserialize(jsonString);
//样本2
List invList=新列表
{
新库存{name=“cheese”,金额=5,插槽=1},
新库存{name=“Bread”,数量=2,插槽=4}
};
//它将产生
//[{“名称”:“奶酪”,“数量”:5,“插槽”:1},{“名称”:“面包”,“数量”:2,“插槽”:4}]
字符串jsonString2=JsonSerializer.Serialize(invList);
//如何反序列化
List inventoryList2=(List)JsonSerializer.Deserialize(jsonString2);

< /代码>它表示没有从库存到清单清单的隐式转换,而是考虑使用<代码> <代码>。您试图将其反序列化为<代码>清单> /COD>类型,但您的JSON包含<代码>库存< /代码>类型。现在,您正处于编译阶段,对JSON一无所知,但是编译器知道,
反序列化
返回的是
库存
,而不是
库存列表
,因此产生了错误。错误不是来自反序列化,而是来自赋值:
库存列表=库存
。您序列化了一个库存并反序列化为库存列表。输入错误。@Phill但这就是问题所在,你是说你需要转换,
Inventory
InventoryList
之间没有隐式转换。您的代码中出现错误-您正在调用
反序列化
,其中
T
是返回类型,但您希望
反序列化
被分配到
库存列表
。。。。这完全没有道理。那么,我如何将项目添加到列表中呢?我不能做inventoryList.Add。当我尝试序列化它时,它不会工作,因为变量“list”已经包含列表中的项(它反序列化列表中的JSON),不需要手动添加它们。在调试模式下反序列化后,您可以检查列表对象以查看结果。那么,为什么不返回任何结果呢?“InventoryList invList=new InventoryList(){invList=new List(){item1,item2,}}};Console.WriteLine(JsonSerializer.Serialize(invList));”如果仍然需要包装器对象-InventoryList,只需替换此位public List invList=new List();使用普通属性public List invList{get;set;}和serialization/dese