.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
}
我目前的情况是我有一个 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
}