Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# JSON编写器和缩进输出_C#_Json - Fatal编程技术网

C# JSON编写器和缩进输出

C# JSON编写器和缩进输出,c#,json,C#,Json,如果标题不够清晰,我很抱歉,因为我甚至不确定如何正确表达这个问题,英语不是我的第一语言,我对使用json编程相当陌生 我有一个Json编写器,它接受各种costum输入,然后从文本字段或组合框中添加某些数据 JsonSerializer serializer = new JsonSerializer(); serializer.NullValueHandling = NullValueHandling.Ignore; using (StreamWriter sw = new StreamWri

如果标题不够清晰,我很抱歉,因为我甚至不确定如何正确表达这个问题,英语不是我的第一语言,我对使用json编程相当陌生

我有一个Json编写器,它接受各种costum输入,然后从文本字段或组合框中添加某些数据

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

谢谢你的建议,这几乎是可行的,但是,我正在尝试用文本框(成本、稀有性等)填充这些字段。我已经更新了我的答案。不要使用
WriteRaw
尝试
WriteRawValue
。这将允许您像往常一样在底部添加更多属性。@derloopkat感谢您的建议,这几乎是可行的,但是,我正在尝试用文本框填充尽可能多的字段,以使其尽可能模块化。修改后的代码是:writer.WriteRaw(“{\'Cost\':”+DescCost.Text+“\'Rarity\':“+DescRarity.Text+”);但这给了我输出:“Description”:{“Cost”:1200000“Rarity”:0}null(我真的不知道null来自哪里)仍然存在!我已经更进一步了!另外,我不能编辑我的旧评论,而且我还可以用快速手指,所以,嗯。@derloopcat是的!真管用!你太棒了@母鸡kesting这种方法效果更好。