考慮以下代碼
var dict = new Dictionary<string, object>
{
{ "key 1", "value 1" },
{ "key 2", 123 }
};
var dictJson = JsonConvert.SerializeObject(dict); // yields {"key 1":"value 1","key 2":123}
var keyValuePair = dict.FirstOrDefault();
var keyValuePairJson = JsonConvert.SerializeObject(keyValuePair); // yields {"Key":"key 1","Value":"value 1"}
第一個問題是,為什么字典的第一個元素KeyValuePair<TKey, TValue>的 json 與 的 json 不同Dictionary<TKey, TValue>?
第二個問題是,如何實作與序列化字典類似的 json 但只有一個專案而不是擴展集合?我的目標是擁有一個類似于下面的類,但沒有在序列化的 json 中獲取Key和Value作為屬性。
public class Foo
{
public KeyValuePair<string, object> Pair { get; set; }
}
uj5u.com熱心網友回復:
為什么字典的第一個元素
KeyValuePair<TKey, TValue>的 json 與 的 json 不同Dictionary<TKey, TValue>?
字典和鍵值對是非常不同的東西。字典不僅僅是鍵值對的集合。當然,這是對字典的一種看法,但如果說字典就是那樣,那就大錯特錯了。
更具體地說,JsonConverterNewtonsoftJson 中有一個專門轉換KeyValuePair為 JSON 的形式:
{ "Key": ..., "Value": ... }
KeyValuePairConverter.
請注意,此表單將鍵和值都轉換為 JSON,這很可能是您將“鍵和值”轉換為 JSON 時想要的。將此與字典轉換器在字典的鍵不是字串時所做的比較 - 它只是呼叫ToString使其成為字串:(
如何實作與序列化字典類似的 json 但只有一個專案而不是擴展集合?
你可以這樣寫JsonConverter:
public class KeyValuePairObjectConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
{
JToken t = JToken.FromObject(value);
if (t.Type != JTokenType.Object)
{
t.WriteTo(writer);
}
else
{
JObject o = (JObject)t;
string key = o.Value<string>("Key");
var val = o["Value"];
writer.WriteStartObject();
writer.WritePropertyName(key);
val.WriteTo(writer);
writer.WriteEndObject();
}
}
public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer)
=> throw new NotImplementedException();
public override bool CanRead => false;
public override bool CanConvert(Type t)
{
if (t.IsValueType && t.IsGenericType)
{
return (t.GetGenericTypeDefinition() == typeof(KeyValuePair<,>)) &&
t.GetGenericArguments()[0] == typeof(string);
}
return false;
}
}
用法:
public class Foo
{
[JsonConverter(typeof(KeyValuePairObjectConverter))]
public KeyValuePair<string, object> Pair { get; set; }
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/329501.html
下一篇:關于合并值的奇怪重復,字典中的鍵
