.NET NewtonSoft JSON 使用自动增量索引反序列化列表

.NET NewtonSoft JSON deserialize list with auto-increment index

我目前的情况是我有一个 json 文件

[
    {
        "first_name" : "Foo",
        "last_name" : "Bar",
        "gender" : 0
    },
    {
        "first_name" : "FooFoo",
        "last_name" : "BarBar",
        "gender" : 1
    }
]

和一个人 class:

class Person
{
    public Id { get; private set; }
    public string FirstName;
    public string LastName;
    public int Gender; 
}

我正在使用这样的解串器:

JArray.ToObject<List<Person>>();

或等价物:

JsonConvert.DeserializeObject<List<Person>>(jsonstr, ...)

尽管 json 对象本身没有,但在 Person class 中有一个 "Id" 字段,我需要它根据 Person 在中的位置增加值名单。

我不能制作 Id public 属性 并在反序列化后设置它的原因是,它是一个 Id,它不应该是可编辑的,我认为这是糟糕的编程。

我听说过 Json转换器。使用它们可以实现吗?我需要一些帮助。总而言之,我需要一种方法将 Json 数组反序列化为对象列表并自动设置它们自动递增 ID。

那么,谢谢你的时间。

你不需要在反序列化过程中改变任何东西,你可以简单地在 class 的构造函数中做一些事情:

static int NextId = 0;

public Person() 
{
     Id = NextId++;
}

而且,是的,您绝对不希望您的 ID 是可编辑的。这里的一个好的模式是

public int Id { get; private set;}

您还可以在 Id 上添加 [JsonIgnore] 属性。这将意味着这不会被分配给。

[JsonIgnore]
public int Id { get; private set;}

重置 ID

public static void ResetNextId(int startId)
{
    NextId = startId;
}

Person.ResetNextId(0);

还有一个 [OnDeserialized] 属性,您可以将其应用于对象的过程,以便在对象被反序列化后分配属性。

[OnDeserialized]
public void OnDeserialized(StreamingContext context)
{
     // Do stuff
}