C# 使用字典生成json
我想以下面的格式生成jsonC# 使用字典生成json,c#,json,asp.net-core,C#,Json,Asp.net Core,我想以下面的格式生成json { "additionalAttributeBlock": [ { "blockTitle": "B1", "B1": [ { "keyNode": "S14", "value": "", "formula": "", "validationID": "",
{
"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;
}
}