Генерация JSON с помощью словаря - PullRequest
0 голосов
/ 02 октября 2018

Я хочу сгенерировать 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 ]

0 голосов
/ 02 октября 2018

Как я могу сказать, чего вы пытаетесь добиться - это 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> { }

Вот и все!Теперь, чтобы воспроизвести пример 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 будет содержать точно такой же результат, как и из вашего вопроса.

Кроме того, вы можете добавить конструктор и некоторые методы получения в AdditionalAttributeBlock класс для упрощения вашей работы:

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: \ но, так какваш вопрос « Generate json используя словарь», я оставлю его вам и настоятельно рекомендую создать для этого пользовательский JsonConverter ( - это образец ).

0 голосов
/ 02 октября 2018

Прежде всего, вы должны получить модель класса 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...