首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >写入json "value“:"value”

写入json "value“:"value”
EN

Stack Overflow用户
提问于 2019-03-11 17:00:53
回答 2查看 99关注 0票数 1

我在我的.net核心项目中使用了newtonsoft,并遇到了一种特殊的json格式。我有一个列表,序列化后得到的“普通”json是这样的:

代码语言:javascript
复制
  {
      "id": "0124",
      "entities": [
        {
          "name": "chris",
          "surname": "green"
        },
        {
          "name": "albert",
          "surname": "red"
        }
      ]
    }

我需要将其转换为类似以下内容:

代码语言:javascript
复制
  {
      "id": "0124",
      "entities": [
        {
          "chris": "green",
          "albert": "red"
        }
      ]
    }

我不知道我的列表中可能有多少个实体。

谢谢大家

编辑

感谢大家的帮助,代码如下:

代码语言:javascript
复制
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。我们将看看它是否有效。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-11 18:34:41

您可以将json反序列化为DTO:

代码语言:javascript
复制
[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; }
}

然后用原始的JObjectJArray构建预期的json

代码语言:javascript
复制
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(),你会得到

代码语言:javascript
复制
{
  "entities": [
    {
      "chris": "green",
      "albert": "red"
    }
  ]
} 
票数 1
EN

Stack Overflow用户

发布于 2019-03-11 22:38:24

@Aleks Andreev我将你的答案设置为正确的,因为它解决了问题,但我更喜欢更好的方法,我使用@MindSwipe注释创建了我的自定义json转换器。

下面是我的代码:

代码语言:javascript
复制
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转换器,如下所示:

代码语言:javascript
复制
var jsonBody = JsonConvert.SerializeObject(manager, new BulkEntityConverter());

其中manager是我的BulkRegisterDto对象

感谢所有的支持人员

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55098291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档