gpt4 book ai didi

c# - 序列化/反序列化多个(不同类型的)对象

转载 作者:太空宇宙 更新时间:2023-11-03 12:34:00 25 4
gpt4 key购买 nike

我正在使用 newtonsoft 的 Json.net。

目前我正在学习数据库存储的替代方案。我有 2 天遇到以下问题:

我想以 JSON 格式在本地保存数据。我目前有以下 (xml) 结构:

<? xml version="1.0"?>
<data>
<transactions>
<transaction>
<id>1</id>
<type>1</type>
<name>a name</name>
<datetime>01-01-2017 00:00</datetime>
<amount>34,05</amount>
</transaction>
<transaction>
<id>2</id>
<type>type2</type>
<name>test transaction 2</name>
<datetime>01-02-2017 00:00</datetime>
<amount>23,03</amount>
</transaction>
</transactions>
<categories>
<category>
<id>1</id>
<name>cat 1</name>
<description>a desc for cat 1</description>
<color>red</color>
<subcategories>
<subcategory>
<id>1</id>
<name>subcat 1</name>
<description>a desc for subcat 1</description>
<color>blue</color>
</subcategory>
<subcategory>
<id>2</id>
<name>subcat 2</name>
<description>a desc for subcat 2</description>
<color>yellow</color>
</subcategory>
</subcategories>
</category>
<category>
<id>2</id>
<name>cat 2</name>
<description>a desc for cat 1</description>
<color>red</color>
</category>
</categories>
</data>

当我将以下内容转换为 JSON 结构时:

 {
"data": {
"transactions": {
"transaction": [
{
"id": "1",
"type": "1",
"name": "a name",
"datetime": "01-01-2017 00:00",
"amount": "34,05"
},
{
"id": "2",
"type": "type2",
"name": "test transaction 2",
"datetime": "01-02-2017 00:00",
"amount": "23,03"
}
]
},
"categories": {
"category": [
{
"id": "1",
"name": "cat 1",
"description": "a desc for cat 1",
"color": "red",
"subcategories": {
"subcategory": [
{
"id": "1",
"name": "subcat 1",
"description": "a desc for subcat 1",
"color": "blue"
},
{
"id": "2",
"name": "subcat 2",
"description": "a desc for subcat 2",
"color": "yellow"
}
]
}
},
{
"id": "2",
"name": "cat 2",
"description": "a desc for cat 1",
"color": "red"
}
]
}
}
}

我目前遇到的问题是我可以读/写一个 json 文件(使用 JSON.NET)但是我只能写下一个(C#)对象。如果我尝试将我的子类别添加到我的类别中,我会得到奇怪的结果:

代码:

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace jsontest
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
List<Category> Categorylist = new List<Category>();
Category c;
SubCategory sc;
for (int i = 0; i < 5; i++)
{
// New category
c = new Category
{
id = i,
name = "Category " + i,
description = "Category description " + i,
color = Color.Red
};

//Creating a few sub categories
if (i == 2 || i == 4)
{
for (int j = 0; j < i; j++)
{
sc = new SubCategory
{
id = j,
name = "SubCategory " + j + "From Category with Id " + i,
description = "Subcategory description " + j + "from Category with Id " + i,
color = Color.Yellow
};
// Add subcategorie to category
c.subcategories.Add(sc);
}
}
// Add to list
Categorylist.Add(c);
}

string json = JsonConvert.SerializeObject(Categorylist, Newtonsoft.Json.Formatting.Indented);
richTextBox1.AppendText(Environment.NewLine + json);
}
}

public class Category
{
public int id { get; set; }
public string name { get; set; }
public string description { get; set; }
public Color color { get; set; }
public List<SubCategory> subcategories = new List<SubCategory>();
}

public class SubCategory
{
public int id { get; set; }
public string name { get; set; }
public string description { get; set; }
public Color color { get; set; }
}
}

结果:

[
{
"subcategories": [],
"id": 0,
"name": "Category 0",
"description": "Category description 0",
"color": "Red"
},
{
"subcategories": [],
"id": 1,
"name": "Category 1",
"description": "Category description 1",
"color": "Red"
},
{
"subcategories": [
{
"id": 0,
"name": "SubCategory 0From Category with Id 2",
"description": "Subcategory description 0from Category with Id 2",
"color": "Yellow"
},
{
"id": 1,
"name": "SubCategory 1From Category with Id 2",
"description": "Subcategory description 1from Category with Id 2",
"color": "Yellow"
}
],
"id": 2,
"name": "Category 2",
"description": "Category description 2",
"color": "Red"
},
{
"subcategories": [],
"id": 3,
"name": "Category 3",
"description": "Category description 3",
"color": "Red"
},
{
"subcategories": [
{
"id": 0,
"name": "SubCategory 0From Category with Id 4",
"description": "Subcategory description 0from Category with Id 4",
"color": "Yellow"
},
{
"id": 1,
"name": "SubCategory 1From Category with Id 4",
"description": "Subcategory description 1from Category with Id 4",
"color": "Yellow"
},
{
"id": 2,
"name": "SubCategory 2From Category with Id 4",
"description": "Subcategory description 2from Category with Id 4",
"color": "Yellow"
},
{
"id": 3,
"name": "SubCategory 3From Category with Id 4",
"description": "Subcategory description 3from Category with Id 4",
"color": "Yellow"
}
],
"id": 4,
"name": "Category 4",
"description": "Category description 4",
"color": "Red"
}
]

有人可以帮助我走上正轨吗?

最佳答案

如果我对问题的理解正确,你希望在添加后保持 JSON 字符串的格式,与第一个相同。为此,您需要创建与您的 JSON 对应的类。您可以使用 this然后您可以将 JSON 字符串反序列化为 RootObject 类的对象,并可以轻松添加 TransactionsCategories。这是添加新类别的示例(添加 Transactions 几乎相同):

var test = JsonConvert.DeserializeObject<RootObject>(json);
test.data.categories.category.Add(new Category()
{
id = "newId",
name = "newName",
color = "newColor",
description = "new description",
subcategories = new Subcategories()
{
subcategory = new List<Subcategory>()
}
});

test 的序列化为您提供了新的 JSON 字符串。

关于c# - 序列化/反序列化多个(不同类型的)对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41697382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com