gpt4 book ai didi

c# - 有时是数组有时是对象时反序列化JSON

转载 作者:IT老高 更新时间:2023-10-28 12:46:29 25 4
gpt4 key购买 nike

我在使用 JSON.NET 库反序列化从 Facebook 返回的数据时遇到了一些麻烦。

从一个简单的墙贴返回的 JSON 如下所示:

{
"attachment":{"description":""},
"permalink":"http://www.facebook.com/permalink.php?story_fbid=123456789"
}

为照片返回的 JSON 如下所示:

"attachment":{
"media":[
{
"href":"http://www.facebook.com/photo.php?fbid=12345",
"alt":"",
"type":"photo",
"src":"http://photos-b.ak.fbcdn.net/hphotos-ak-ash1/12345_s.jpg",
"photo":{"aid":"1234","pid":"1234","fbid":"1234","owner":"1234","index":"12","width":"720","height":"482"}}
],

一切都很好,我没有问题。我现在遇到了一个来自移动客户端的简单墙贴,其中包含以下 JSON,而反序列化现在因这一个帖子而失败:

"attachment":
{
"media":{},
"name":"",
"caption":"",
"description":"",
"properties":{},
"icon":"http://www.facebook.com/images/icons/mobile_app.gif",
"fb_object_type":""
},
"permalink":"http://www.facebook.com/1234"

这是我反序列化的类:

public class FacebookAttachment
{
public string Name { get; set; }
public string Description { get; set; }
public string Href { get; set; }
public FacebookPostType Fb_Object_Type { get; set; }
public string Fb_Object_Id { get; set; }

[JsonConverter(typeof(FacebookMediaJsonConverter))]
public List<FacebookMedia> { get; set; }

public string Permalink { get; set; }
}

如果不使用 FacebookMediaJsonConverter,我会收到错误消息:无法将 JSON 对象反序列化为类型“System.Collections.Generic.List`1[FacebookMedia]”。这是有道理的,因为在 JSON 中,Media 不是一个集合。

我发现这篇文章描述了一个类似的问题,所以我试图沿着这条路走:Deserialize JSON, sometimes value is an array, sometimes "" (blank string)

我的转换器看起来像:

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.StartArray)
return serializer.Deserialize<List<FacebookMedia>>(reader);
else
return null;
}

效果很好,只是我现在遇到了一个新异常:

在 JsonSerializerInternalReader.cs 内部,CreateValueInternal():反序列化对象时出现意外 token :PropertyName

reader.Value 的值是“永久链接”。我可以在 switch 中清楚地看到 JsonToken.PropertyName 没有案例。

我需要在转换器中做一些不同的事情吗?谢谢你的帮助。

最佳答案

"Using a Custom JsonConverter to fix bad JSON results" 上提供了有关如何处理这种情况的非常详细的说明。 .

总而言之,你可以扩展默认的 JSON.NET 转换器做

  1. 用问题注释属性

    [JsonConverter(typeof(SingleValueArrayConverter<OrderItem>))]
    public List<OrderItem> items;
  2. 扩展转换器以返回所需类型的列表,即使对于单个对象也是如此

    public class SingleValueArrayConverter<T> : JsonConverter
    {
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
    throw new NotImplementedException();
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
    object retVal = new Object();
    if (reader.TokenType == JsonToken.StartObject)
    {
    T instance = (T)serializer.Deserialize(reader, typeof(T));
    retVal = new List<T>() { instance };
    } else if (reader.TokenType == JsonToken.StartArray) {
    retVal = serializer.Deserialize(reader, objectType);
    }
    return retVal;
    }

    public override bool CanConvert(Type objectType)
    {
    return true;
    }
    }

正如文章中提到的,这个扩展并不完全通用,但如果你能得到一个列表,它就可以工作。

关于c# - 有时是数组有时是对象时反序列化JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5224697/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com