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": {

在C#中使用Json.NET时,我在序列化类时遇到了问题,因为我需要自定义属性名

这就是我现在拥有的:

{
  "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);

谢谢!工作出色:)