簡體   English   中英

如何使用JSON.NET將List派生的類型序列化為類似數組的對象

[英]How to serialize a type derived from List as an array-like object with JSON.NET

考慮以下從List派生的類:

public class Foo : List<string>
{
    public string Bar { get; set; }
}

使用JSON.NET對其進行序列化將轉儲Bar屬性並生成一個常規數組:

var foo = new Foo() { "a", "b", "c" };
foo.Bar = "baz";
JsonConvert.SerializeObject(foo); // ["a","b","c"]

我的序列化結果如何獲得以下類似數組的對象?

{"0": "a", "1": "b", "2": "c", "length": 3, "bar": "baz"}

是自定義序列化器是唯一的解決方法,還是可以為我做一個JSON.NET設置?

我認為,獲得所需內容的最簡單方法是執行以下操作:

var foo = new Foo() { "a", "b", "c" };
foo.Bar = "baz";

var data = foo
    .Select((value, index) => new { value, index })
    .ToDictionary(wrapper => wrapper.index.ToString(), wrapper => (object)wrapper.value);

data.Add("length", foo.Count);
data.Add("bar", foo.Bar);

var json = JsonConvert.SerializeObject(data);
//{"0":"a","1":"b","2":"c","length":3,"bar":"baz"}

對於具有任何數量的屬性的所有元素,解決此問題的更通用方法是此代碼:

var foo = new Foo() { "a", "b", "c" };
foo.Bar = "baz";
foo.Beer = "beer";

var json = GetJsonWithItemsAndProperties(foo);
//{"0":"a","1":"b","2":"c","length":3,"Bar":"baz","Beer":"beer"}

//...//

private static string GetJsonWithItemsAndProperties<T>(IReadOnlyCollection<T> listWithProperties)
{
    var data = listWithProperties
        .Select((value, index) => new {value, index})
        .ToDictionary(wrapper => wrapper.index.ToString(), wrapper => (object) wrapper.value);

    data.Add("length", data.Count);

    listWithProperties.GetType()
        .GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance |
                        System.Reflection.BindingFlags.DeclaredOnly).ToList()
        .ForEach(p => data.Add(p.Name, p.GetValue(listWithProperties)));

    return JsonConvert.SerializeObject(data);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM