gpt4 book ai didi

c# - Json.net 反序列化列表给出重复项

转载 作者:可可西里 更新时间:2023-11-01 03:06:26 26 4
gpt4 key购买 nike

我刚刚开始使用 Newtonsoft.Json (Json.net)。在我的第一个简单测试中,我在反序列化通用列表时遇到了问题。在下面的代码示例中,我序列化了一个对象,其中包含三种类型的简单整数列表(属性、成员变量和数组)。

生成的 json 看起来不错(列表被转换为 json 数组)。但是,当我将 json 反序列化回相同类型的新对象时,所有列表项都会重复,数组除外。我已经通过第二次序列化来说明这一点。

通过四处搜索,我读到反序列化器也填充的列表可能有一个“私有(private)”支持字段。

所以我的问题是:在以下情况下是否有一种(最好是简单的)方法来避免重复项?

代码

using System;
using System.Collections.Generic;
using Newtonsoft.Json;

namespace JsonSerializeExample
{
public class Program
{
static void Main()
{
var data = new SomeData();
var json = JsonConvert.SerializeObject(data);
Console.WriteLine("First : {0}", json);
var data2 = JsonConvert.DeserializeObject<SomeData>(json);
var json2 = JsonConvert.SerializeObject(data2);
Console.WriteLine("Second: {0}", json2);
}
}

public class SomeData
{
public string SimpleField;
public int[] IntArray;
public IList<int> IntListProperty { get; set; }
public IList<int> IntListMember;

public SomeData()
{
SimpleField = "Some data";
IntArray = new[] { 7, 8, 9 };
IntListProperty = new List<int> { 1, 2, 3 };
IntListMember = new List<int> { 4, 5, 6 };
}
}
}

结果输出

First : {"SimpleField":"Some data","IntArray":[7,8,9],"IntListMember":[4,5,6],"IntListProperty":[1,2,3]}
Second: {"SimpleField":"Some data","IntArray":[7,8,9],"IntListMember":[4,5,6,4,5,6],"IntListProperty":[1,2,3,1,2,3]}

此处可能与 Json.Net duplicates private list items 有一些重叠.但是,我觉得我的问题更简单,我还是没有弄明白。

最佳答案

那是因为您要在构造函数中添加项目。处理列表时,反序列化器中的一种常见方法基本上是:

  • 通过 getter 读取列表
    • 如果列表为空:创建一个新列表并通过属性 setter 分配,如果有的话
  • 依次反序列化每一项,追加(Add)到列表

这是因为大多数列表成员没有 setter ,即

public List<Foo> Items {get {...}} // <=== no set

对比数组,数组必须有一个 setter 才有用;因此,方法通常是:

  • 依次反序列化每一项,并追加(Add)到一个临时列表
  • 将列表转换为数组(ToArray),并通过setter赋值

一些序列化程序为您提供了控制此行为的选项(其他则没有);并且一些序列化程序使您能够完全绕过构造函数(其他的则不能)。

关于c# - Json.net 反序列化列表给出重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13394401/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com