You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何反序列化ARIN Whois REST API返回的可变结构JSON对象?

解决ARIN Whois API JSON反序列化的结构不一致问题

嘿,这个问题我太熟了!ARIN Whois REST API这个“时而数组时而对象”的设计确实坑了不少刚接触它的开发者,尤其是JSON新手。别担心,咱们只需要先把两种结构归一化成数组形式,后面的反序列化就轻松多了。

核心思路:统一转成数组

不管API返回的nets是单个对象还是数组,咱们先把它处理成一个包含1个或多个元素的数组,这样后续反序列化的时候直接按数组类型来解析就行,不用写一堆分支判断。

Python 示例

用json模块解析后先判断类型,把单个对象转成数组:

import json

# 假设response_text是API返回的JSON字符串
data = json.loads(response_text)

# 处理nets字段,确保它是数组
nets = data.get('nets')
if isinstance(nets, dict):
    # 如果是单个net对象,包装成数组
    data['nets'] = [nets]

# 现在可以放心遍历处理了
for net in data['nets']:
    print(f"网段名称:{net['netName']},起始地址:{net['startAddress']}")

Java(Jackson 库)示例

Jackson提供了现成的配置和注解来处理这种情况:

方法1:全局自动转换

ObjectMapper mapper = new ObjectMapper();
// 开启该配置,当预期是数组但收到单个对象时自动包装成数组
mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);

// 定义对应实体类,比如NetList包含List<Net> nets字段
NetList netList = mapper.readValue(jsonResponse, NetList.class);

方法2:字段级注解(更灵活)

如果不想全局生效,只给nets字段加注解:

public class NetList {
    // 注解表示允许单个对象被解析为List
    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
    private List<Net> nets;

    // getter、setter方法省略
}

C#(Newtonsoft.Json 库)示例

自定义一个转换器来处理单对象/数组的转换:

public class SingleOrArrayConverter<T> : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(List<T>);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JToken token = JToken.Load(reader);
        return token.Type == JTokenType.Array 
            ? token.ToObject<List<T>>() 
            : new List<T> { token.ToObject<T>() };
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        serializer.Serialize(writer, value);
    }
}

// 在实体类的字段上应用这个转换器
public class NetList
{
    [JsonConverter(typeof(SingleOrArrayConverter<Net>))]
    public List<Net> Nets { get; set; }
}

// 反序列化时直接使用
NetList netList = JsonConvert.DeserializeObject<NetList>(jsonString);

这样处理之后,不管API返回的是单个net还是多个net,咱们的代码都能统一处理,再也不用纠结结构差异啦。

内容的提问来源于stack exchange,提问作者GMAP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:23:48