JSON编写器和缩进输出

时间:2018-05-01 10:32:42

标签: c# json

如果标题不尽可能清晰,我很抱歉,因为我甚至不确定如何正确地说出问题,英语不是我的第一语言,而且我对使用json编程很新。

我有一个Json编写器,它接受各种costum输入,然后从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}

我的问题在于"描述"因为我无法想到如何将我的代码放入其他{}或甚至放入"描述" :然后将第二部分留空,而不用#34;"关闭它。

1 个答案:

答案 0 :(得分:2)

“描述”的值不是“带括号的字符串”,而是“具有两个属性的对象”。所以你需要启动另一个对象:

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)
            )
        )
    );