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

时间:2018-01-28 11:57:12

标签: c# json.net json-deserialization

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

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

和一个Person类:

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类中有一个“Id”字段,我需要根据Person在列表中的位置来增加值。

我无法创建Id公共属性并在反序列化后设置它的原因是因为,它是一个Id,它不应该是可编辑的,我认为是糟糕的编程。

我听说过JsonConverters。这是可以实现的吗?我需要一些帮助。总结我需要一种方法将Json数组反序列化为对象列表,并自动设置它们自动递增ID。

那么,谢谢你的时间。

1 个答案:

答案 0 :(得分:2)

您不需要在反序列化过程中更改任何内容,您只需在类的构造函数中执行某些操作:

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
}