напишите json "значение": "значение" - PullRequest
1 голос
/ 11 марта 2019

Я использую newtonsoft в своем проекте ядра .net и столкнулся с определенным форматом json.У меня есть список, и «нормальный» json, который выходит после сериализации, выглядит примерно так:

  {
      "id": "0124",
      "entities": [
        {
          "name": "chris",
          "surname": "green"
        },
        {
          "name": "albert",
          "surname": "red"
        }
      ]
    }

Мне нужно преобразовать его в нечто вроде:

  {
      "id": "0124",
      "entities": [
        {
          "chris": "green",
          "albert": "red"
        }
      ]
    }

Iне знаю, сколько сущностей может быть в моем списке.

Спасибо всем

РЕДАКТИРОВАТЬ

Спасибо за помощь, ребята, так что это код:

var jsonBody = JsonConvert.SerializeObject(
                new BulkRegisterDto
                {
                    Id = "0124",
                    Entities = entities
                }
            );


public class BulkRegisterDto
    {
        [JsonProperty(PropertyName = "id")]
        public string Id{ get; set; }
        [JsonProperty(PropertyName = "entities")]
        public IList<Person> Entities { get; set; }
    }

 public class Person
    {
        public string Name { get; set; }
        public string Surname { get; set; }
    }

Это не реальные свойства.Я пытаюсь использовать динамический JObject.Посмотрим, будет ли это работать

Ответы [ 2 ]

2 голосов
/ 11 марта 2019

@ Алекс Андреев Я выбрал ваш ответ как правильный, потому что он решает проблему, но я предпочитаю лучший подход, и я создал свой собственный конвертер json, используя комментарий @MindSwipe.

Это мой код ниже:

public class BulkEntityConverter : JsonConverter
    {
        public override object ReadJson(
            JsonReader reader,
            Type objectType,
            object existingValue,
            JsonSerializer serializer)
        {
            var obj = (JObject)JObject.ReadFrom(reader);

            JProperty property = obj.Properties().FirstOrDefault();
            // I didn't use this method
            return new BulkRegisterDto
            {
                Id = property.Name,
                Entities = new List<Person>()
            };
        }

        public override void WriteJson(
            JsonWriter writer,
            object value,
            JsonSerializer serializer)
        {
            BulkRegisterDto permission = (BulkRegisterDto)value;

            var innerEntities = new JObject();
            foreach (var entry in permission.Entities)
            {
                innerEntities.Add(entry.Name, entry.Surname);
            }

            var root = new JObject
            {
                { "id", permission.Id},
                { "entities", new JArray { innerEntities } }
            };

            root.WriteTo(writer);
        }

        public override bool CanConvert(Type t)
        {
            return typeof(BulkRegisterDto).IsAssignableFrom(t);
        }

        public override bool CanRead
        {
            get { return true; }
        }
    }

Используя этот способ, я могу получить четкий класс, где использовать мой конвертер json, например:

var jsonBody = JsonConvert.SerializeObject(manager, new BulkEntityConverter());

, где manager - это мой объект BulkRegisterDto

Спасибо за поддержку, ребята

1 голос
/ 11 марта 2019

Вы можете десериализовать свой JSON в DTO:

[DataContract]
private class Person
{
    [DataMember(Name = "name")]
    public string Name { get; set; }

    [DataMember(Name = "surname")]
    public string Surname { get; set; }
}

[DataContract]
private class Entities
{
    [DataMember(Name = "entities")]
    public Person[] Persons { get; set; }
}

, а затем построить ожидаемый JSON с необработанными JObject и JArray

var input = "{\r\n  \"entities\": [\r\n    {\r\n      \"name\": \"chris\",\r\n      \"surname\": \"green\"\r\n    },\r\n    {\r\n      \"name\": \"albert\",\r\n      \"surname\": \"red\"\r\n    }\r\n  ]\r\n}";
var json = JsonConvert.DeserializeObject<Entities>(input);

var root = new JObject();
var innerObject = new JObject();

root.Add("entities", new JArray {innerObject});

foreach (var entry in json.Persons)
    innerObject.Add(entry.Name, entry.Surname);

Если вы позвоните root.ToString(), выполучит

{
  "entities": [
    {
      "chris": "green",
      "albert": "red"
    }
  ]
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...