【问题标题】:Web API - JSON serialize properties as array of stringsWeb API - JSON 将属性序列化为字符串数组
【发布时间】:2014-09-10 12:18:46
【问题描述】:

我有课

public class Person
    { 
      public string Name { get; set; }
      public string LastName { get; set; }
      public int Age { get; set; }
    }

我想把它序列化成:

{ "人": "[约翰, 史密斯, 13]" }

而不是

{“姓名”:“约翰”、“姓氏”:“史密斯”、“年龄”:13}

是否可以在不编写自定义序列化程序的情况下实现这一目标?如果没有,如何将自定义序列化程序仅应用于特定类?

【问题讨论】:

  • 你可以试试 {"Person" : ["John","Smith",13]}。

标签: json serialization json.net asp.net-web-api


【解决方案1】:

由于您在序列化Person 的实例时想要获取的 json 字符串不是标准字符串,因此您需要编写一个自定义转换器并用它来装饰您的类。一种方法如下。编写继承自JsonConverter的类:

public class CustomConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        if (value == null) return;

        writer.WriteStartObject();
        writer.WritePropertyName(value.GetType().Name);

        writer.WriteStartArray();

        var properties = value.GetType().GetProperties();

        foreach (var property in properties)
            writer.WriteValue(value.GetType().GetProperty(property.Name).GetValue(value));

        writer.WriteEndArray();
        writer.WriteEndObject();
    }

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

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof (Person);
    }
}

JsonConverter 属性装饰你的类:

[JsonConverter(typeof(CustomConverter))]
public class Person
{
    public string Name { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
}

现在假设您使用以下代码:

var person = new Person
{
    Name = "John",
    LastName = "Smith",
    Age = 13
};

var json = JsonConvert.SerializeObject(person, Formatting.Indented);

json 变量将具有此值:

{
    "Person": [
        "John",
        "Smith",
        13
    ]
}

演示here

【讨论】:

    猜你喜欢
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多