我正在构建一个用于修改现有json文件的应用程序。我已经制作了与我的json代码相对应的所有类。大多数时候我需要复制整个json集合,然后只更改一些东西(比如id,index等)。
我成功复制并添加了整个集合,当我尝试更改该集合中的某些内容时,它会对我从中进行复制的集合进行更改。你能告诉我我做错了吗?
private void addFlightButton_Click(object sender, RoutedEventArgs e) {
var originDestinationGroup = jsonObject.search.originDestinationGroup;
OriginDestinationGroup oDGitem = originDestinationGroup.Last();
var departureDateGroup = oDGitem.departureDateGroup;
DepartureDateGroup dDGitem = departureDateGroup.Last();
var originDestinationOptionRef = dDGitem.originDestinationOptionRef;
OriginDestinationOptionRef oDORitem = originDestinationOptionRef.Last();
originDestinationOptionRef.Add(oDORitem);
char uriNumber = oDORitem.uri[oDORitem.uri.Length - 1];
string uriString = oDORitem.uri.TrimEnd(oDORitem.uri[oDORitem.uri.Length - 1]);
int idNumber = Convert.ToInt32(oDORitem.id);
int indexNumber = oDORitem.index;
uriNumber++;
idNumber++;
indexNumber++;
OriginDestinationOptionRef oDORitemModify = originDestinationOptionRef.Last();
oDORitemModify.uri = uriString + uriNumber.ToString();
oDORitemModify.id = idNumber.ToString();
oDORitemModify.index = indexNumber;
}
json响应 - 未修改:
"search": {
"originDestinationGroup": [{
"departureDateGroup": [{
"originDestinationOptionRef": [{
"uri": "option/1",
"id": "1",
"index": 0
},
{
"uri": "option/2",
"id": "2",
"index": 1
}
]
json响应 - 由我的代码修改:
"search": {
"originDestinationGroup": [{
"departureDateGroup": [{
"originDestinationOptionRef": [{
"uri": "option/1",
"id": "1",
"index": 0
},
{
"uri": "option/3",
"id": "3",
"index": 2
},
{
"uri": "option/3",
"id": "3",
"index": 2
}
]
json响应 - 它如何被修改:
"search": {
"originDestinationGroup": [{
"departureDateGroup": [{
"originDestinationOptionRef": [{
"uri": "/option/1",
"id": "1",
"index": 0
},
{
"uri": "option/2",
"id": "2",
"index": 1
},
{
"uri": "option/3",
"id": "3",
"index": 2
}
]
类:
public class Search {
public List<OriginDestinationGroup> originDestinationGroup { get; set; }
}
public class OriginDestinationGroup {
public List<DepartureDateGroup> departureDateGroup { get; set; }
}
public class DepartureDateGroup {
public List<OriginDestinationOptionRef> originDestinationOptionRef { get; set; }
}
public class OriginDestinationOptionRef {
public string uri { get; set; }
public string id { get; set; }
public int index { get; set; }
}
提前谢谢。
答案 0 :(得分:2)
所以,你正在收集该集合的最后一项:
OriginDestinationOptionRef oDORitem = originDestinationOptionRef.Last();
并将其添加到同一个集合中:
originDestinationOptionRef.Add(oDORitem);
因此该集合现在包含指向同一对象的两个指针。然后,您获取集合中的最后一个对象并进行修改,但由于您复制了引用而不是创建新对象,因此新条目和您复制的条目都将更改。 因此,您只需创建一个新的OriginDestinationOptionRef并将其添加到集合中,而不是复制现有的。
答案 1 :(得分:1)
这是你出错的地方:
OriginDestinationOptionRef oDORitem = originDestinationOptionRef.Last();
originDestinationOptionRef.Add(oDORitem);
此代码从列表中获取最后一项,然后将该非常相同的对象的新引用添加到同一列表中。因此列表变为1个条目变长,但最后两个条目现在指向内存中的同一个对象(原始对象,然后您可以继续更改)。
要解决此问题,请创建一个新的OriginDestinationOptionRef
对象:
var newItem = new OriginDestinationOptionRef();
originDestinationOptionRef.Add(newItem);
然后使用现有逻辑设置newItem
。