C# 序列化时将特定属性名与Json.NET一起使用
在C#中使用Json.NET时,我在序列化类时遇到了问题,因为我需要自定义属性名 这就是我现在拥有的:C# 序列化时将特定属性名与Json.NET一起使用,c#,json,json.net,C#,Json,Json.net,在C#中使用Json.NET时,我在序列化类时遇到了问题,因为我需要自定义属性名 这就是我现在拥有的: { "baseName": { "subName1": { "name": null, "longName": null, "asd1": null, "asd2": null }, "subName2": [ { "id": "ID_NUMBER", "info": {
{
"baseName": {
"subName1": {
"name": null,
"longName": null,
"asd1": null,
"asd2": null
},
"subName2": [
{
"id": "ID_NUMBER",
"info": {
"someInfo1": "asd",
"someInfo2": "asd2"
}
}
]
}
}
这就是我想要的:
{
"baseName": {
"subName1": {
"name": null,
"longName": null,
"asd1": null,
"asd2": null
},
"subName2": [
{
"ID_NUMBER": {
"someInfo1": "asd",
"someInfo2": "asd2"
}
}
]
}
}
也就是说,我希望id\u编号
是包含键someInfo1
和someInfo2
的对象的键,而不是具有id
和id\u编号
的键
顶级JSON代码是使用这些类生成的(很抱歉名称不好):
class-JSONTestClass
{
公共JSONBaseTestClass baseName;
}
类JSONBaseTestClass
{
公共JSONSubTestClass1子名称1;
公共列表子名称2;
}
类JSONSubTestClass1
{
公共字符串名称;
公共字符串长名称;
公共字符串asd1;
公共字符串asd2;
}
类JSONSubTestClass2
{
公共字符串id;
公共JSONInfoTestClass信息;
}
类JSONInfoTestClass
{
公共字符串someInfo1;
公共字符串someInfo2;
}
这是:
private void MakeJSON()
{
// This value can be changed at runtime
string specificId = "ID_NUMBER";
JSONInfoTestClass jitc = new JSONInfoTestClass();
jitc.someInfo1 = "asd";
jitc.someInfo2 = "asd2";
JSONTestClass jtc = new JSONTestClass();
JSONBaseTestClass jbtc = new JSONBaseTestClass();
JSONSubTestClass1 jstc1 = new JSONSubTestClass1();
JSONSubTestClass2 jstc2 = new JSONSubTestClass2();
jstc2.id = specificId;
jstc2.info = jitc;
List<JSONSubTestClass2> list = new List<JSONSubTestClass2>();
list.Add(jstc2);
jbtc.subName1 = jstc1;
jbtc.subName2 = list;
jtc.baseName = jbtc;
// Convert to JSON
string json = JsonConvert.SerializeObject(jtc, Formatting.Indented);
tbxJSONOutput.Text = json;
}
private void MakeJSON()
{
//此值可以在运行时更改
字符串specifiid=“ID\u编号”;
JSONInfoTestClass jitc=新的JSONInfoTestClass();
jitc.someInfo1=“asd”;
jitc.someInfo2=“asd2”;
JSONTestClass jtc=新的JSONTestClass();
JSONBaseTestClass jbtc=新的JSONBaseTestClass();
JSONSubTestClass1 jstc1=新的JSONSubTestClass1();
JSONSubTestClass2 jstc2=新的JSONSubTestClass2();
jstc2.id=specific id;
jstc2.info=jitc;
列表=新列表();
添加列表(jstc2);
jbtc.subName1=jstc1;
jbtc.subName2=列表;
jtc.baseName=jbtc;
//转换为JSON
字符串json=JsonConvert.SerializeObject(jtc,Formatting.Indented);
tbxJSONOutput.Text=json;
}
需要哪些更改才能获得与上述第二个JSON响应相对应的JSON输出?您可以通过为
JSONSubTestClass2
类创建自定义的JsonConverter
来获得所需的输出,如下所示:
class JSONSubTestClass2Converter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return (objectType == typeof(JSONSubTestClass2));
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
JSONSubTestClass2 jstc2 = (JSONSubTestClass2)value;
JObject jo = new JObject();
jo.Add(jstc2.id, JObject.FromObject(jstc2.info));
jo.WriteTo(writer);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.Converters.Add(new JSONSubTestClass2Converter());
settings.Formatting = Formatting.Indented;
// Convert to JSON
string json = JsonConvert.SerializeObject(jtc, settings);
然后,按如下方式序列化类:
class JSONSubTestClass2Converter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return (objectType == typeof(JSONSubTestClass2));
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
JSONSubTestClass2 jstc2 = (JSONSubTestClass2)value;
JObject jo = new JObject();
jo.Add(jstc2.id, JObject.FromObject(jstc2.info));
jo.WriteTo(writer);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.Converters.Add(new JSONSubTestClass2Converter());
settings.Formatting = Formatting.Indented;
// Convert to JSON
string json = JsonConvert.SerializeObject(jtc, settings);
谢谢!工作出色:)