[英]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.