簡體   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