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

如何将JSON的Line1/Line2映射到模型Addr_1/Addr_2并输出指定属性名

解决方案

你的问题出在JsonProperty特性默认会同时控制**序列化(输出JSON)和反序列化(解析输入JSON)**的字段名。当前代码里指定了"Line1",所以输出时也会用这个名称,而非属性名Addr_1。要实现“输入用Line1/Line2映射,输出用Addr_1/Addr_2”,分两种常用JSON库的情况处理:

情况1:使用Newtonsoft.Json(Json.NET)

如果你的项目用的是Newtonsoft.Json(版本12.0.1及以上),可以用JsonAlias特性替代JsonProperty来指定反序列化的别名,序列化时自动使用属性本身的名称:

public class Addresses
{
     [JsonAlias("Line1")]
     public string Addr_1 { get; set; }
     [JsonAlias("Line2")]
     public string Addr_2 { get; set; }
}

如果你的Newtonsoft.Json版本低于12.0.1,没有JsonAlias特性,可以自定义ContractResolver来分开控制:

public class CustomAddressContractResolver : DefaultContractResolver
{
    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        JsonProperty property = base.CreateProperty(member, memberSerialization);
        
        // 反序列化时映射别名
        if (property.PropertyName == "Addr_1")
        {
            property.PropertyName = "Line1";
            // 序列化时改回原属性名
            property.SerializationName = "Addr_1";
        }
        else if (property.PropertyName == "Addr_2")
        {
            property.PropertyName = "Line2";
            property.SerializationName = "Addr_2";
        }
        
        return property;
    }
}

使用时,序列化和反序列化分别指定Resolver:

// 反序列化(用Line1/Line2映射)
var addresses = JsonConvert.DeserializeObject<Addresses>(inputJson, new JsonSerializerSettings
{
    ContractResolver = new CustomAddressContractResolver()
});

// 序列化(输出Addr_1/Addr_2)
var outputJson = JsonConvert.SerializeObject(addresses, new JsonSerializerSettings
{
    ContractResolver = new DefaultContractResolver()
});

情况2:使用System.Text.Json(.NET Core 3.0+ 内置)

对于.NET Core 3.0及以上版本的内置System.Text.Json,用JsonPropertyName指定序列化输出的名称,JsonAlias指定反序列化的别名:

using System.Text.Json.Serialization;

public class Addresses
{
     [JsonPropertyName("Addr_1")]
     [JsonAlias("Line1")]
     public string Addr_1 { get; set; }
     [JsonPropertyName("Addr_2")]
     [JsonAlias("Line2")]
     public string Addr_2 { get; set; }
}

这样配置后,解析输入JSON时会识别Line1/Line2并映射到Addr_1/Addr_2,序列化输出时则会使用Addr_1/Addr_2作为字段名。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 17:27:26