如何更改最后一个JSON项

时间:2018-01-02 15:33:48

标签: c# json

我正在构建一个用于修改现有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; }
}

提前谢谢。

2 个答案:

答案 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

的属性