简体   繁体   中英

serializing nested json c#

Big apologies for the long post. I need to create the below json format for a post to rest api in c#. The below call works and I have used successfully in Postman to add it to the target system.

{
"item": {
    "attrs": {
        "attr": [{
                "name": "IP_Category",
                "value": "Miscellaneous"
            }, {
                "name": "Description",
                "value": "Picture of Rabbit"
            }, {
                "name": "Title",
                "value": "A Rabbit"
            }
        ]
    },
    "resrs": {
        "res": [{
                "filename": "Rabbit.jpg",
                "base64": "/9j/4AAQSkZJR"
            }
        ]
    },
    "acl": {
        "name": "Submitter"
        },
       "entityName": "IP_Document"
    }
}

Based on the research I've done I need to copy and "paste special" into a new class file in visual studio so it can create the class objects based on the json format (Pretty cool!). And this is what it creates:

namespace BasicWebApp
{

public class Rootobject
{
    public Item item { get; set; }
}

public class Item
{
    public Attrs attrs { get; set; }
    public Resrs resrs { get; set; }
    public Acl acl { get; set; }
    public string entityName { get; set; }
}

public class Attrs
{
    public Attr[] attr { get; set; }
}

public class Attr
{
    public string name { get; set; }
    public string value { get; set; }
}

public class Resrs
{
    public Re[] res { get; set; }
}

public class Re
{
    public string filename { get; set; }
    public string base64 { get; set; }
}

public class Acl
{
    public string name { get; set; }
}
}

Problem 1: Why is vs renaming the res json object to to class Re? Is it a reserved word in c#?

Problem 2: I know I have to nest things in this fashion but I two levels deep and not sure what to code?

var model = new Rootobject();
model.item = new Item
{
    attrs = new Attrs
    {
        attr = new List<Attr>
            {
                 **now what??**
            }
    }
}

Don't have answer to your first question yet(but looking for it):

For your second question, at now what part you just do:

new Attr(){ name = "name1", value = "value1" },
new Attr(){ name = "name1", value = "value2" }

But that's not what i advise. I advise you to have your Attr collection ready then assign it. Like:

var model = new Rootobject();
model.item = new Item
{
    attrs = yourAttrCollection
}

It also goes for everyting else you do. Have your stuff ready, then assign them. It increases readability in nested objects.

Problem 1: Why is vs renaming the res json object to to class Re? Is it a reserved word in c#?

No Re is not reserved word in class. As mentioned by TheGeneral

res is plural for re's

You can use JsonProperty attribute to resolve this issue like

public class Resrs
{
    [JsonProperty("res")]
    public Re[] res { get; set; }
}

Problem 2: I know I have to nest things in this fashion but I two levels deep and not sure what to code?

var model = new Rootobject();
model.item = new Item
{
    attrs = new Attrs
    {
        attr = new List<Attr>
            {
                 new Attr { name = "abc", value = "ABC" },
                 new Attr { name = "pqr", value = "PQR" }
            }
    }
}

Thanks to all that responded. It helped. I ended up using the below code to create the json object I needed.

var model = new RootObject();
            model.item = new Item
            {
                attrs = new Attrs
                {
                    attr = new List<Attr>
                {
                    new Attr { name = "IP_Category", value = ddlContent.Text },
                    new Attr { name = "Description", value = txtDesc.Text },
                    new Attr { name = "Title", value = txtTitle.Text }
                }
                },
                resrs = new Resrs
                {
                    res = new List<Re>
                {
                    new Re { filename = fName, base64 = base64string},
                }
                },
                acl = new Acl
                {
                    name = "Submitter"
                },
                entityName = "IP_Document"
            };

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM