Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何通过属性影响json序列化_C#_Json_Serialization - Fatal编程技术网

C# 如何通过属性影响json序列化

C# 如何通过属性影响json序列化,c#,json,serialization,C#,Json,Serialization,我有一门课: public class Query { public Query(int[] ids) => IDs = ids; public int[] IDs { get; } } 假设我有: var query = new Query(new int[]{1, 2, 3}); var json = JsonConvert.SerializeObject(query) 我需要序列化结果为: json == "[1, 2, 3]" 默认情况下,我得到: json

我有一门课:

public class Query
{
    public Query(int[] ids) => IDs = ids;
    public int[] IDs { get; }
}
假设我有:

var query = new Query(new int[]{1, 2, 3});
var json = JsonConvert.SerializeObject(query)
我需要序列化结果为:

json == "[1, 2, 3]"
默认情况下,我得到:

json == "{ "IDs": [1, 2, 3] }"
我只能访问
查询
类,并且只能通过它影响序列化过程。当传递给常规的
JsonConvert.SerializeObject
方法时,有没有办法使用一些JsonAttributes或其他方法强制将类序列化为我需要的状态

澄清:
我不能只做
JsonConver.SerializeObject(Query.IDs)
,或者诸如此类的事情。查询对象沿着管道发送(它必须是整个对象),中间的某个地方将其序列化并作为请求发送给只期望数组的Web API。我无法更改管道,也无法更改API,因为其他系统依赖它,所以我唯一剩下的方法就是在
查询
类本身上设置json序列化程序。

因此,根据Sam的建议,我使用了CustomJsonConverter:

[JsonConverter(typeof(CustomQueryConverter))]
公共类查询
{
公共查询(int[]id)
{
IDs=IDs;
}
公共int[]id{get;}
}
公共类CustomQueryConverter:JsonConverter
{
公共覆盖布尔CanConvert(类型objectType)
{
返回objectType==typeof(查询);
}
公共重写对象ReadJson(JsonReader阅读器,类型objectType,对象existingValue,JsonSerializer序列化程序)
{
var数组=JArray.Load(读卡器);
int[]items=array?.Select(jv=>(int)jv.ToArray();
返回新查询(项目);
}
公共重写void WriteJson(JsonWriter编写器、对象值、JsonSerializer序列化器)
{
var query=作为查询的值;
serializer.Serialize(writer,query.id);
}
}
以及测试它的测试:

[事实]
公开无效测试()
{
var query=newquery(newint[]{1,2,3});
var json=JsonConvert.SerializeObject(查询);
等于(“[1,2,3]”,json);
var deserialized=JsonConvert.DeserializeObject(json);
Assert.Equal(1,反序列化的.IDs[0]);
Assert.Equal(2,反序列化的.IDs[1]);
Assert.Equal(3,反序列化的.IDs[2]);
}

我无法仅序列化数组。这是一条更大的流水线,在这里我输入查询对象,中间,它被序列化为JSON,发送给API,只期望IDS。我不想深入讨论细节,但要点是——我在输入端有一个查询对象,我只需要在输出端序列化ID——目前我无法更改系统的其余部分。管道输入需要一个类的对象来实现某个接口(为了可读性,在问题中提到了)。该对象被向下发送,神奇的事情发生了,在某个时刻它被序列化并发送到一个外部web API,该API只需要一个ID数组,作为json。这一个API设计得很糟糕,它应该在输入上使用查询对象,但我无法更改它,我无法访问它的代码,所以我需要找到一种解决方法。我只能使用Query类,不能通过管道发送ID,因为这不会实现特殊接口-