序列化对象的属性以在数组中分离JSON对象 [英] Serialize an object's properties to separate JSON objects in an array

查看:118
本文介绍了序列化对象的属性以在数组中分离JSON对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想序列化属性,但每个属性都封装在数组中的单独JSON对象中.

I want to serialize properties but with each property enclosed in a separate JSON object in an array.

以下示例:

public class Metadata
{
    public string Name { get; set; }
    public Guid Id { get; set; }
}

public void SerializeCars()
{
    var data = new Metadata { Name = "MyName", Id = Guid.NewGuid() };
    var json = JsonConvert.SerializeObject(data, Formatting.Indented);
}

当前结果将是:

{
    "Name": "MyName",
    "Id": "f9c4bc06-0b99-47ff-b22b-ea094fc188ee"
}

我希望它成为(缺少上面的"td"类):

I want it to be (missing "td" class above):

{
    "td": [{
        "name": "myName"
    }, {
        "id": "f9c4bc06-0b99-47ff-b22b-ea094fc188ee"
    }]
}

可以解决吗?

推荐答案

您可以创建一个自定义JsonConverter以获得所需的输出:

You can create a custom JsonConverter to get the output you want:

class MetadataConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(Metadata));
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        JArray array = new JArray();
        foreach (PropertyInfo pi in value.GetType().GetProperties().Where(p => p.CanRead))
        {
            array.Add(new JObject(new JProperty(pi.Name, pi.GetValue(value, null))));
        }
        JObject obj = new JObject(new JProperty("td", array));
        obj.WriteTo(writer);
    }

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

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

}

然后,像这样使用它:

var json = JsonConvert.SerializeObject(data, Formatting.Indented, new MetadataConverter());

提琴: https://dotnetfiddle.net/5IRDeu

这篇关于序列化对象的属性以在数组中分离JSON对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆