C# 使用字典生成json

C# 使用字典生成json,c#,json,asp.net-core,C#,Json,Asp.net Core,我想以下面的格式生成json { "additionalAttributeBlock": [ { "blockTitle": "B1", "B1": [ { "keyNode": "S14", "value": "", "formula": "", "validationID": "",

我想以下面的格式生成json

{
"additionalAttributeBlock": [
    {
        "blockTitle": "B1",
        "B1": [
            {
                "keyNode": "S14",
                "value": "",
                "formula": "",
                "validationID": "",
                "measureID": "5.13",
                "classificationID": "1.1",
                "nodeID": 31,
                "tabCode": "38.1",
                "dataCapID": 0
            }
        ]
    },
    {
        "blockTitle": "B2",
        "B2": [
            {
                "keyNode": "T14",
                "value": "",
                "formula": "",
                "validationID": "",
                "measureID": "5.14",
                "classificationID": "1.1",
                "nodeID": 31,
                "tabCode": "38.1",
                "dataCapID": 0
            }
        ]
    }

]
}
这是我的c#结构和代码

public class AdditionalAttribute
{
    public string KeyNode { get; set; }
    public string Value { get; set; }
    public string Formula { get; set; }
    public string ValidationID { get; set; }
    public string MeasureID { get; set; }
    public string ClassificationID { get; set; }
    public int NodeID { get; set; }
    public string TabCode { get; set; }
    public int DataCapID { get; set; }
}

public class AdditionalAttributeBlock
    {
        public AdditionalAttributeBlock()
        {
            AdditionalAttribute = new Dictionary<string, List<AdditionalAttribute>>();
        }
        public string BlockTitle { get; set; }

        public Dictionary<string,List<AdditionalAttribute>> AdditionalAttribute { get; set; }

    }

public class AllEntities
    {
        public List<AdditionalAttributeBlock> AdditionalAttributeBlock { get; set; }
    }
但它给了我以下格式的json和上面的代码

{
    "additionalAttributeBlock": [
        {
            "blockTitle": "% Fe",
"additionalAttribute":{
            "% Fe": [
                {
                    "keyNode": "S14",
                    "value": "",
                    "formula": "",
                    "validationID": "",
                    "measureID": "5.13",
                    "classificationID": "1.1",
                    "nodeID": 31,
                    "tabCode": "38.1",
                    "dataCapID": 0
                },
                {
                    "keyNode": "S15",
                    "value": "",
                    "formula": "",
                    "validationID": "",
                    "measureID": "5.13",
                    "classificationID": "1.2",
                    "nodeID": 31,
                    "tabCode": "38.1",
                    "dataCapID": 0
                }
            ]
}
        },
        {
            "blockTitle": "% Co",
"additionalAttribute":{
            "% Co": [
                {
                    "keyNode": "T14",
                    "value": "",
                    "formula": "",
                    "validationID": "",
                    "measureID": "5.14",
                    "classificationID": "1.1",
                    "nodeID": 31,
                    "tabCode": "38.1",
                    "dataCapID": 0
                },
                {
                    "keyNode": "T15",
                    "value": "",
                    "formula": "",
                    "validationID": "",
                    "measureID": "5.14",
                    "classificationID": "1.2",
                    "nodeID": 31,
                    "tabCode": "38.1",
                    "dataCapID": 0
                }
            ]
            }
        }




    ]
}
那么如何生成正确的json呢?我尝试过不同的变化和组合,但它没有给我的结果,我正在寻找


我是否需要更改c#类/模型的结构以生成正确格式的json,或者我需要更改的呈现方式。

首先,您必须从中获取
json
的类模型

另一种方法是使用
JSON.Net
而不使用JSON模型

JObject data = JObject.Parse(jsonText);
JObject additionalAttributeBlock= data["additionalAttributeBlock"] as JObject;
//additionalAttributeBlock.Add("name", JObject.Parse(yourjsonText);
additionalAttributeBlock.Add("name",JObject.FromObject(obj);

首先,您必须从中获取
json
的类模型

另一种方法是使用
JSON.Net
而不使用JSON模型

JObject data = JObject.Parse(jsonText);
JObject additionalAttributeBlock= data["additionalAttributeBlock"] as JObject;
//additionalAttributeBlock.Add("name", JObject.Parse(yourjsonText);
additionalAttributeBlock.Add("name",JObject.FromObject(obj);

正如我所说,您想要实现的是这个JSON(伪JSON代码):

就这样!现在,从您的问题中复制示例JSON:

var b1 = new AdditionalAttributeBlock();
b1["BlockTitle"] = "B1";
b1["B1"] = new AdditionalAttribute { ... };

var b2 = new AdditionalAttributeBlock();
b2["BlockTitle"] = "B2";
b2["B2"] = new AdditionalAttribute { ... };

var allBlocks = new List<AdditionalAttributeBlock> { b1, b2 };
var allEntities = new AllEntities { AdditionalAttributeBlock = allBlocks };
var json = JsonConvert.SerializeObject(allEntities);

注意:这个解决方案的副作用是,现在从JSON字符串反序列化对象并不是那么容易:\n但是,由于您的问题是“使用字典生成JSON”,我将把它留给您,并强烈建议为此()创建一个自定义的
JsonConverter

,正如我所说,您试图实现的是以下JSON(伪JSON代码):

就这样!现在,从您的问题中复制示例JSON:

var b1 = new AdditionalAttributeBlock();
b1["BlockTitle"] = "B1";
b1["B1"] = new AdditionalAttribute { ... };

var b2 = new AdditionalAttributeBlock();
b2["BlockTitle"] = "B2";
b2["B2"] = new AdditionalAttribute { ... };

var allBlocks = new List<AdditionalAttributeBlock> { b1, b2 };
var allEntities = new AllEntities { AdditionalAttributeBlock = allBlocks };
var json = JsonConvert.SerializeObject(allEntities);


注意:此解决方案的副作用是,现在从JSON字符串反序列化对象并不是那么容易:\n但是,由于您的问题是“使用字典生成JSON”,我将留给您,并强烈建议为此().

您使用的是JSON.Net吗?不,这是API在JSON中生成的响应。我将该类作为响应传递,该响应在UI上转换为json,据我所知,asp.net核心WebAPI使用json.net:\无论如何,我认为是的。。我知道。。我已经试过了。。但是如果你能帮我看一下我的代码,那将非常有帮助。我现在明白了,你需要某种“动态创建的类,比如B1或B2”。用
字典
替换
附加属性块
怎么样?如果可以的话,我可能会发布一个带有示例代码的答案。您使用的是JSON.Net吗?不,这是API在JSON中生成的响应。我将该类作为响应传递,该响应在UI上转换为json,据我所知,asp.net核心WebAPI使用json.net:\无论如何,我认为是的。。我知道。。我已经试过了。。但是如果你能帮我看一下我的代码,那将非常有帮助。我现在明白了,你需要某种“动态创建的类,比如B1或B2”。用
字典
替换
附加属性块
怎么样?如果可以的话,我可以发布一个带有示例代码的答案。同意。。但B1、B2不是固定的类/值。。这是一个通用的。。这就是为什么我将它们作为键添加到字典中,在列表中有这些值。这方面的任何帮助都值得赞赏。。但B1、B2不是固定的类/值。。这是一个通用的。。这就是为什么我将它们作为键添加到字典中,在列表中有这些值。如果我在Dictionary中添加列表,那么它会工作吗?@XamDev,你是说从
Dictionary
而不是
Dictionary
继承吗?是的。。确切地意思是我将添加附加属性作为ClassTypeYou可以尝试,但是您的
块标题不能是字符串,必须是
列表
而不是对象如果我在Dictionary中添加列表,它就会工作?@XamDev,您的意思是继承自
Dictionary
而不是
Dictionary
?是的。。确切地我的意思是,我将添加额外的属性作为ClassTypeYou可以尝试,但是您的
块标题不能是字符串,必须是
列表
{
    "additionalAttributeBlock": [
        {
            "blockTitle": <SOME_BLOCK_TITLE>,
            <SOME_BLOCK_TITLE>: [
                { AdditionalAttribute_INSTANCE_1 },
                { AdditionalAttribute_INSTANCE_2 }
            ]
        },
        {
            "blockTitle": <ANOTHER_BLOCK_TITLE>,
            <ANOTHER_BLOCK_TITLE>: [
                { AdditionalAttribute_INSTANCE_3 }
            ]
        }
    ]
}
public class AdditionalAttributeBlock : Dictionary<string, object> { }
var b1 = new AdditionalAttributeBlock();
b1["BlockTitle"] = "B1";
b1["B1"] = new AdditionalAttribute { ... };

var b2 = new AdditionalAttributeBlock();
b2["BlockTitle"] = "B2";
b2["B2"] = new AdditionalAttribute { ... };

var allBlocks = new List<AdditionalAttributeBlock> { b1, b2 };
var allEntities = new AllEntities { AdditionalAttributeBlock = allBlocks };
var json = JsonConvert.SerializeObject(allEntities);
public class AdditionalAttributeBlock : Dictionary<string, object>
{
    public string BlockTitle => this["BlockTitle"] as string;
    public AdditionalAttribute Attribute => this[BlockTitle] as AdditionalAttribute;

    public AdditionalAttributeBlock(string title, AdditionalAttributeBlock attribute)
    {
        this["BlockTitle"] = title;
        this[title] = attribute;
    }
}