問題是,PHP中的json_encode()
函數爲正在讀取其輸出的工具留下了不確定性。在PHP中,這兩個列表和字典都是相同類型的array
。將空JSON數組強制轉換爲字典類型
echo json_encode([]); // []
echo json_encode(["5" => "something"]); // {"5": "something"}
在JSON.NET我想迫使這兩個[]
和{"5": "something"}
轉換爲Dictionary<string, string>
類型。但它將[]
識別爲Dictionary的禁止結構並拋出異常。
我可以快速保留空JSON數組爲空還是強制它們轉換爲空字典類型?
最終解決
我修改接受的答案,以使它通用和可重複使用的其他類型。
public class DictionaryOrEmptyArrayConverter<T,F> : JsonConverter
{
public override bool CanWrite { get { return false; } }
public override bool CanConvert(Type objectType)
{
return objectType == typeof(Dictionary<T, F>);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
switch (reader.TokenType)
{
case JsonToken.StartArray:
reader.Read();
if (reader.TokenType == JsonToken.EndArray)
return new Dictionary<T, F>();
else
throw new JsonSerializationException("Non-empty JSON array does not make a valid Dictionary!");
case JsonToken.Null:
return null;
case JsonToken.StartObject:
var tw = new System.IO.StringWriter();
var writer = new JsonTextWriter(tw);
writer.WriteStartObject();
int initialDepth = reader.Depth;
while (reader.Read() && reader.Depth > initialDepth)
{
writer.WriteToken(reader);
}
writer.WriteEndObject();
writer.Flush();
return JsonConvert.DeserializeObject<Dictionary<T, F>>(tw.ToString());
default:
throw new JsonSerializationException("Unexpected token!");
}
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
你應該和你的JSON對象,用它作爲下面的例子中:
public class Company
{
public string industry_name { get; set; }
[JsonConverter(typeof(DictionaryOrEmptyArrayConverter<int, Upgrade>))]
public Dictionary<int, Upgrade> upgrades { get; set; }
}
public class Upgrade
{
public int level { get; set; }
}
它可以讓你的JSON字符串快速轉換的對象與DeserializeObject
方法:
var result = JsonConvert.DeserializeObject<Company>(jsonString);