代码之家  ›  专栏  ›  技术社区  ›  XamDev

使用字典生成json

  •  0
  • XamDev  · 技术社区  · 6 年前

    我想生成以下格式的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; }
        }
    

    在代码中,我添加了如下列表

    additionalAttributeBlock.AdditionalAttribute.Add(itemAddAttrM.SubUnitName, 
    lstAdditionalAttributes);
    
    lstAdditionalAttributeBlocks.Add(additionalAttributeBlock);
    

    但它给了我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还是需要改变呈现方式。

    2 回复  |  直到 6 年前
        1
  •  2
  •   vasily.sib    6 年前

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

    {
        "additionalAttributeBlock": [
            {
                "blockTitle": <SOME_BLOCK_TITLE>,
                <SOME_BLOCK_TITLE>: [
                    { AdditionalAttribute_INSTANCE_1 },
                    { AdditionalAttribute_INSTANCE_2 }
                ]
            },
            {
                "blockTitle": <ANOTHER_BLOCK_TITLE>,
                <ANOTHER_BLOCK_TITLE>: [
                    { AdditionalAttribute_INSTANCE_3 }
                ]
            }
        ]
    }
    

    好吧,这很容易实现序列化。继承你的遗产 AdditionalAttributeBlock Dictionary :

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

    现在 json 将包含与您的问题完全相同的结果。

    此外,您还可以将构造函数和一些getter添加到 附加属性块 类以简化您的工作:

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

    生成 json使用字典”,我将留给你,并强烈建议创建一个自定义 JsonConverter 为了这个( here is a sample ).

        2
  •  0
  •   Hossein    6 年前

    json json2csharp

    public class B1
    {
        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 B2
    {
        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 string blockTitle { get; set; }
        public List<B1> B1 { get; set; }
        public List<B2> B2 { get; set; }
    }
    
    public class RootObject
    {
        public List<AdditionalAttributeBlock> additionalAttributeBlock { get; set; }
    }
    

    那你就可以用 Newtonsoft.Json 这样地:

    var data= Newtonsoft.Json.JsonConvert.DeserializeObject<RootObject>(json);
    
    // You can add into B1/B2
    data.additionalAttributeBlock.Add(...);
    

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