Создание Json в правильном формате

Я пытаюсь создать приведенный ниже Json

{
    "retailer": "The retailer",
    "sites": [{
        "id": "1234",
        "Sitename": "Microsoft",
        "website": "www.microsoft.com"
    }],
    "Products": [{
        "Name": "Visual Studio",
        "Year": "2017"
    }]
}

сайты (массив, но я использовал список). Товары (массив, но я использовал список)

Мой код (который не создает вышеуказанный Json)

        Parent par = new Parent();
        List<Sites> parList = new List<Sites>();

        Sites site = new Sites();
        Software sw = new Software();
        List<Software> swList = new List<Software>();

        par.retailer = "The retailer";

        site.Id = "1234";
        site.Sitename = "Microsoft";
        site.Website = "www.microsoft.com";

        par.sites = parList;

        sw.Name = "Visual Studio";
        sw.Year = DateTime.Year;

        swList.Add(sw);

        site.Products = swList;

        parList.Add(site);

        MemoryStream stream1 = new MemoryStream();
        DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Parent));

        ser.WriteObject(stream1, par);

        stream1.Position = 0;
        StreamReader sr = new StreamReader(stream1);
        Console.WriteLine(op);

Что мне нужно сделать, так это сгенерировать Json (данные поступают из базы данных, но на данный момент я жестко закодировал значения) и опубликовать их в стороннем сервисе, но я не могу получить Json в нужном мне формате? Как я мог этого добиться?


person Computer    schedule 23.12.2016    source источник
comment
Просто не используйте DataContractJsonSerializer. Он был создан до того, как появился стандарт Json. Все и веб-API ASP.NET используют Json.NET.   -  person Panagiotis Kanavos    schedule 23.12.2016
comment
Вы предлагаете использовать это вместо json.codeplex.com   -  person Computer    schedule 23.12.2016
comment
@Computer Да сериализуй все подряд! Это намного лучше и проще.   -  person Pawel Maga    schedule 23.12.2016


Ответы (2)


Для таких вещей мне нравятся сайты, которые конвертируют json в классы, тогда вы точно знаете, с чем работаете.

Для вашего примера немного гугл-фу и получаю эти классы.

public class Site
{
    public string id { get; set; }
    public string Sitename { get; set; }
    public string website { get; set; }
}

public class Product
{
    public string Name { get; set; }
    public string Year { get; set; }
}

public class RootObject
{
    public string retailer { get; set; }
    public List<Site> sites { get; set; }
    public List<Product> Products { get; set; }
}

Теперь вы сможете установить данные в RootObject и правильно их сериализовать.

person Monolithcode    schedule 23.12.2016
comment
Это то, что у меня уже есть. Я не слишком уверен, что вы предлагаете мне изменить, поскольку у меня уже есть экземпляр/список этих классов, но Json неверен? - person Computer; 23.12.2016
comment
Из того, что я вижу, ваши классы должны быть неправильными, ваша настройка site.Products = swList; Из json на сайте нет продуктов, сам корневой объект - так что родительский в вашем случае - это то, что должно хранить продукты напрямую. - person Monolithcode; 23.12.2016
comment
Вы были на правильном пути с этим. В документации, которую я прочитал, указано RootObject: розничный продавец — название компании, сайты — массив, содержащий имя вашего сайта, но не упоминается о продуктах. Как вы определили, что мне нужно разместить список свойств здесь? Я новичок в Json, но любые указатели были бы замечательными. Отмечу это как ответ, как только получу ваш ответ :-) - person Computer; 23.12.2016
comment
Хороший материал, у меня когда-то были серьезные проблемы с отображением json в прошлом, и когда я снова вернулся к нему через год, у меня был момент ясности, игнорировать документацию и ручное возиться, если есть пример, который вы предоставили, вы можете просто разместите его на любом сайте, таком как json2csharp.com, например, это выдает json в форме класса С#, чтобы вы могли видеть, с чем именно вы имеете дело, без беспорядка, без суеты. - person Monolithcode; 23.12.2016

Создайте такие классы

public class Site
{
    public string id { get; set; }
    public string Sitename { get; set; }
    public string website { get; set; }
}

public class Product
{
    public string Name { get; set; }
    public string Year { get; set; }
}

public class Example
{
    public string retailer { get; set; }
    public List<Site> sites { get; set; }
    public List<Product> Products { get; set; }
}

а затем поместите все свои данные в объекты, подобные этому

Example par = new Example();
List<Site> parList = new List<Site>();
Site site = new Site();
Product sw = new Product();
List<Product> swList = new List<Product>();
par.retailer = "The retailer";
site.id = "1234";
site.Sitename = "Microsoft";
site.website = "www.microsoft.com";
par.sites = parList;
sw.Name = "Visual Studio";
sw.Year = DateTime.Now.Year.ToString();
swList.Add(sw);
par.Products = swList;
parList.Add(site);  

затем просто сериализуйте свой объект с помощью Newtonsoft

string ser = JsonConvert.SerializeObject(par);
Console.WriteLine(ser);

Так выглядит ser

Скриншот ‹code›ser‹/code›

person Mohit Shrivastava    schedule 23.12.2016