【发布时间】:2017-02-22 07:27:55
【问题描述】:
我有一个从 API 返回的 JSON 字符串,有时像这样,其中 "result" 键只有一个空对象:
{
"_meta": {
"status": "SUCCESS",
"count": 0
},
"result": {}
}
或者这个,其中"result" 键有一个对象数组:
{
"_meta": {
"status": "SUCCESS",
"count": 0
},
"result": [
{ ... },
{ ... }
]
}
我尝试从这个question 实现自定义JsonConverter,但我想我没有运气。这是我的实现:
class EmptyObjectJsonConverter<T> : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return true;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
object retObj = new Object();
if (reader.TokenType == JsonToken.StartArray)
{
retObj = serializer.Deserialize<List<T>>(reader);
}
else if (reader.TokenType == JsonToken.StartObject)
{
retObj = new List<T>();
}
return retObj;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
我是这样使用的:
public class ApiReturn
{
public ApiMeta _Meta { get; set; }
[JsonConverter(typeof(EmptyObjectJsonConverter<ApiResult>))]
public List<ApiResult> Result { get; set; }
}
我想从上面的实现中实现的是:如果令牌是起始数组,则以正常方式反序列化它,但如果令牌是起始对象,则返回一个空的对象列表。
但是,当我尝试使用具有空对象的 "result" 键运行程序时,它会抛出异常:Additional text found in JSON string after finishing deserializing object.,并且生成的 ApiReturn.Result 为空。
我是否以错误的方式实现它?任何帮助将不胜感激。
更新基于@A。 Chiesa回答:请看我对GetApiResult的实现:
[JsonProperty("result")]
public JToken Result { get; set; }
public T GetResultAs<T>()
{
var objectReturned = default(T);
try
{
if (Result.Type == JTokenType.Array)
{
objectReturned = Result.ToObject<T>();
}
else if (Result.Type == JTokenType.Object)
{
// Should it return an empty List<ApiResult> if I use type List<ApiResult> ?
objectReturned = default(T);
}
}
catch
{
objectReturned = default(T);
}
return objectReturned;
}
为什么当 JSON 节点令牌是对象时我得到 null?当我使用GetResultAs<List<ApiResult>> 时,它是否应该返回一个空的List<ApiResult>?
【问题讨论】:
标签: c# json serialization json.net