簡體   English   中英

使用自定義Json序列化器創建集合

[英]Creating a collection with custom Json serializer

這段代碼是ASP.Net Web API控制器的一部分,在將其發送到UI之前,我有一個特殊的要求來修改最終Json中的某些值。

我當前的代碼如下:

// Web API controller

public partial class ViewRController
        {
       [HttpGet]
            public DataMapList FetchEmployeeDataList()
            {
                DataMapList returnDataMapList = new DataMapList();

                return (returnDataMapList);
            }
        }

// Type definition and details

    [JsonObject]
        [JsonConverter(typeof(DataMapListSerializer))]
        public class DataMapList
        {
            public List<Dictionary<object, object>> employeeSalaryMappingList = null;

            public DataMapList()
            {
                employeeSalaryMappingList = new List<Dictionary<object, object>>();
                employeeSalaryMappingList.Add(new Dictionary<object, object>());

                employeeSalaryMappingList[0].Add(1, 10000);
                employeeSalaryMappingList[0].Add(2, 13000);
                employeeSalaryMappingList[0].Add(3, 15000);

                employeeSalaryMappingList.Add(new Dictionary<object, object>());

                employeeSalaryMappingList[1].Add(4, 9000);
                employeeSalaryMappingList[1].Add(5, 12000);
                employeeSalaryMappingList[1].Add(6, 11000);
            }
        }

// Custom Json serializer

public class DataMapListSerializer : JsonConverter
    {
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            var employeeSalaryDataMapList = value as DataMapList;
            var employeeSalaryMappingList = employeeSalaryDataMapList.employeeSalaryMappingList;


            writer.WriteStartObject();
            foreach (var employeeSalaryMappingDictionary in employeeSalaryMappingList)
            {
                writer.WritePropertyName("ED");
                writer.WriteStartObject();

                foreach (var keyValuePair in employeeSalaryMappingDictionary)
                {
                    writer.WritePropertyName("ID-" + keyValuePair.Key);
                    serializer.Serialize(writer, keyValuePair.Value);
                }

                writer.WriteEndObject();
            }

            writer.WriteEndObject();
        }       

        public override bool CanConvert(Type objectType)
        {
            return typeof(DataMapList).IsAssignableFrom(objectType);
        }
    }

我面臨的問題是我的結果:

{ 
   "ED": { "ID-1": 10000, "ID-2": 13000, "ID-3": 15000 }, 
  "ED": { "ID-4": 9000, "ID-5": 12000, "ID-6": 11000 } 
}

但是,由於我正在序列化一個集合(.Net列表類型,.Net集合),所以我希望得到以下結果

[ 
   "ED": { "ID-1": 10000, "ID-2": 13000, "ID-3": 15000 }, 
  "ED": { "ID-4": 9000, "ID-5": 12000, "ID-6": 11000 } 
]

實際上,當我嘗試在Json Lint中進行驗證時,當前結果顯示了有效的Json但終止了一部分,因此將以下內容顯示為有效的Json,但這僅是一種轉移

{
    "ED": {
        "ID-4": 9000,
        "ID-5": 12000,
        "ID-6": 11000
    }
}

我試過替換writer.WriteStartObject(); writer.WriteEndObject(); 通過writer.WriteStartArray(); writer.WriteEndArray(); ,在遍歷類型中的List的第一個foreach循環之前,但這會導致異常,因此無濟於事

"exceptionMessage": "Token StartArray in state ObjectStart would result in an invalid JSON object. Path '

任何解決問題的建議請讓我知道是否需要任何澄清

JSON中 ,名稱/值對必須位於對象{} 它們不能直接在數組[] 因此,您嘗試創建的JSON無效,這就是為什么您遇到異常的原因:

[ 
   "ED": { "ID-1": 10000, "ID-2": 13000, "ID-3": 15000 }, 
   "ED": { "ID-4": 9000, "ID-5": 12000, "ID-6": 11000 } 
]

為了使其成為有效的集合,必須將每個ED名稱/值對包裝在這樣的對象中:

[ 
   { 
      "ED": { "ID-1": 10000, "ID-2": 13000, "ID-3": 15000 } 
   }, 
   { 
      "ED": { "ID-4": 9000, "ID-5": 12000, "ID-6": 11000 } 
   }
]

一旦看到,解決方案就會變得清晰起來:在您的DataMapListSerializer您需要在循環外部使用DataMapListSerializer writer.WriteStartArray()writer.WriteEndArray() ,並且需要在您的循環內部添加writer.WriteStartObject()writer.WriteEndObject()環。

    writer.WriteStartArray();

    foreach (var employeeSalaryMappingDictionary in employeeSalaryMappingList)
    {
        writer.WriteStartObject();

            writer.WritePropertyName("ED");
            writer.WriteStartObject();

            foreach (var keyValuePair in employeeSalaryMappingDictionary)
            {
                writer.WritePropertyName("ID-" + keyValuePair.Key);
                serializer.Serialize(writer, keyValuePair.Value);
            }

            writer.WriteEndObject();

        writer.WriteEndObject();
    }

    writer.WriteEndArray();

小提琴: https : //dotnetfiddle.net/OT4HKM

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM