Добавьте элемент root к объекту при сериализации в JSON с помощью System.Text. Json - PullRequest
1 голос
/ 10 июля 2020

Все, при выполнении следующего кода мы сталкиваемся со следующим исключением (выделено жирным шрифтом), мы пытаемся добавить "тест" корневого узла в конец json результата. мы хотим достичь этого без анонимных объектов или классов-оболочек.

"Невозможно записать свойство JSON в массиве или в качестве первого токена JSON. Текущий тип токена -« Нет ».

 internal static class Program
    {
        public static void Main(string[] args)
        {
            customer cust = new customer();
            cust.firstname = "first";
            cust.lastname = "last";

            Console.WriteLine(AddRootToJson("test", cust));
        }

        public static string AddRootToJson(string root, object obj)
        {
            var msSt = new MemoryStream {Position = 0};
            using var utf8JsonWriter = new Utf8JsonWriter(msSt);
            utf8JsonWriter.WriteStartObject(root);
            JsonSerializer.Serialize(utf8JsonWriter, obj);
            utf8JsonWriter.WriteEndObject();
            utf8JsonWriter.Flush();
            using var reader = new StreamReader(msSt);
            return reader.ReadToEnd();
        }
    }


    public class customer
    {
        public string firstname;
        public string lastname;
    }

Ответы [ 2 ]

4 голосов
/ 10 июля 2020

Прежде всего, в настоящее время System.Text.Json не поддерживает сериализацию полей, поэтому вам нужно будет изменить свой класс (см. Поддержка publi c и не-publi c полей в docs ):

public class customer
{
    public string firstname {get;set;}
    public string lastname {get;set;}
}

После этого вы можете попробовать следующее:

public static string AddRootToJson(string root, object obj)
{
    using var msSt = new MemoryStream();
    using var utf8JsonWriter = new Utf8JsonWriter(msSt);
    utf8JsonWriter.WriteStartObject();
    utf8JsonWriter.WritePropertyName(root);
    JsonSerializer.Serialize(utf8JsonWriter, obj);
    utf8JsonWriter.WriteEndObject();
    utf8JsonWriter.Flush();
    return Encoding.UTF8.GetString(msSt.ToArray());
}

Console.WriteLine(AddRootToJson("test", new customer {firstname = "first", lastname = "last"})); // prints {"test":{"firstname":"first","lastname":"last"}}
0 голосов
/ 10 июля 2020

Если я понял, что вы правы, вы хотите получить что-то вроде этого:

{"test",
    [
      {"first",
      "last"}
      ....
    ]
}

Просто создайте для него другую модель:

public class FullModel
{
    public List<Customer> Customers {get;set;}
    public string Root {get;set;}
}

И измените свой класс Customer:

public class Customer
{
    public string FirstName {get;set;}
    public string LastName {get;set;}
}

Теперь, шаг за шагом:

public static void Main(string[] args)
    {
        List<Customer> customers = new List<Customers>();
        customers.Add(new Customer{FirstName="first",LastName="last"});
        FullModel fullModel = new FullModel
        {
            Root = "test",
            Customers = customers
        };
         
        Console.WriteLine(AddRootToJson(cust));
    }

public static string AddRootToJson(object obj)
    {
        var msSt = new MemoryStream {Position = 0};
        using var utf8JsonWriter = new Utf8JsonWriter(msSt);
        JsonSerializer.Serialize(utf8JsonWriter, obj);
        utf8JsonWriter.WriteEndObject();
        utf8JsonWriter.Flush();
        using var reader = new StreamReader(msSt);
        return reader.ReadToEnd();
    }

Вы можете изменить метод в зависимости от вашего представления. Надеюсь, это поможет тебе. Удачи.

...