c# - JSON 编写器和缩进输出
问题描述
如果标题不够清晰,我深表歉意,因为我什至不确定如何正确表达这个问题,英语不是我的第一语言,而且我对使用 json 进行编程相当陌生。
我有一个 Json 编写器,它接受各种服装输入,然后从 Textfields 或 Comboboxes 添加某些数据。
JsonSerializer serializer = new JsonSerializer();
serializer.NullValueHandling = NullValueHandling.Ignore;
using (StreamWriter sw = new StreamWriter(saveFileDialog.FileName))
using (JsonWriter writer = new JsonTextWriter(sw))
{
writer.Formatting = Formatting.Indented;
writer.WritePropertyName("Category");
writer.WriteValue(WeaponCategoryComboBox.SelectedItem.ToString());
writer.WritePropertyName("Type");
writer.WriteValue(WeaponTypeComboBox.SelectedItem.ToString());
writer.WritePropertyName("WeaponSubType");
writer.WriteValue(WeaponSubTypeComboBox.SelectedItem.ToString());
例如,这给了我一个输出
"Category": "Missile",
"Type": "LRM",
"WeaponSubType": "LRM20",
这很好用,但是,输出格式中有一部分是我试图复制的,其中所有代码都缩进并在一个额外的 {} 括号中,比如
"WeaponEffectID" : "WeaponEffect-Weapon_AC20_Single", //Still the normal code I can replicate)
"Description" : {
"Cost" : 180000,
"Rarity" : 0}
我的问题在于“描述”,因为我无法想出一种方法如何将我的代码放入那些额外的 {} 甚至放入“描述”:然后将第二部分留空而不用关闭它一个 ”,”。
解决方案
该“描述”的值不是“带大括号的字符串”而是“具有两个属性的对象”。所以你需要启动另一个对象:
writer.WritePropertyName("WeaponSubType");
writer.WriteValue("LRM20");
writer.WritePropertyName("Description");
writer.WriteStartObject();
writer.WritePropertyName("Cost");
writer.WriteValue(180000);
writer.WritePropertyName("Rarity");
writer.WriteValue(0);
writer.WriteEndObject();
这将创建您想要的 JSON 语法:
"WeaponSubType": "LRM20",
"Description": {
"Cost": 180000,
"Rarity": 0
}
请注意,您可能需要{}
在此代码周围添加另一对以创建有效的 JSON。只需WriteStartObject()
用作您的第一行和WriteEndObject()
最后一行。
编辑
或者,如果我可以建议另一种方法:
// using Newtonsoft.Json.Linq
var json = new JObject();
json.Add("Category", "Missile");
json.Add("Type", "LRM");
json.Add("WeaponSubType", "LRM20");
var desc = new JObject();
desc.Add("Cost", 180000);
desc.Add("Rarity", 0);
json.Add("Description", desc);
var jsonstring = json.ToString(Newtonsoft.Json.Formatting.Indented);
现在您可以将该 jsonstring 写入文件。
当然使用您的输入而不是我的硬编码值。
如果你想变得花哨,你可以得到完全相同的结果:
// using Newtonsoft.Json.Linq
var json = new JObject(
new JProperty("Category", "Missile"),
new JProperty("Type", "LRM"),
new JProperty("WeaponSubType", "LRM20"),
new JProperty("Description",
new JObject(
new JProperty("Cost", 180000),
new JProperty("Rarity", 0)
)
)
);
推荐阅读
- c++ - C++ 被认为是冯诺依曼编程语言吗?
- elasticsearch - 如何在弹性搜索中决定正则表达式和通配符
- google-apps-script - 用于从自动 Google 表格的新行中复制缺失单元格的简单脚本
- sockets - 处理多个 UDP 客户端
- node.js - 如何传递像我的用户名这样的数据并将其放在他们创建的帖子中
- xpath - 如何在 XPath 中选择没有前置文本的文本节点?
- botframework - 是否可以从其他直接客户端的对话中向机器人发送活动?
- excel - 如何在excel上读取带有平滑线图的散点图?
- r - 如何对R中的下一列进行子集化
- python - 循环输入为 url 的函数