繁体   English   中英

序列化时在Json.NET中使用特定的属性名称

[英]Use specific property name with Json.NET when serializing

在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_NUMBER成为包含键someInfo1someInfo2的对象的键,而不是具有id和值ID_NUMBER的键。

顶级JSON代码使用以下类生成(对那些不好的名字表示抱歉):

class JSONTestClass
{
    public JSONBaseTestClass baseName;
}

class JSONBaseTestClass
{
    public JSONSubTestClass1 subName1;
    public List<JSONSubTestClass2> subName2;
}

class JSONSubTestClass1
{
    public string name;
    public string longName;
    public string asd1;
    public string asd2;
}

class JSONSubTestClass2
{
    public string id;
    public JSONInfoTestClass info;
}

class JSONInfoTestClass
{
    public string someInfo1;
    public string 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;
}

需要进行哪些更改,以便我可以获得与上述第二个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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM