我正在从API中检索JSON。我正在使用newtonsoft(这是json.net吗?)将其反序列化为对象列表。有用。
不幸的是,我还需要将其作为JSON传递给其他人(他们无法直接调用API,只有我可以访问它)。我不幸地说,因为我需要输出与收到的JSON不同的JSON(属性名称需要不同)。
例如,我有一个名为Person的类,其名称为Name。我想获得“People”,所以我向该API发出请求以获取上述JSON,并获取Person列表。不幸的是,API没有给我返回具有Name属性的人,它返回了我的pname。所以为了映射这个,我只是这样做:
[JsonProperty("pname")]
这一切都很好 - 它将pname转换为name,我的类现在具有值!我有一个名字的人名单。
现在我需要将这个对象列表作为“名称”返回给其他人,但是当我将我的人员类序列化为JSON时,它将JSON写为“pname”,当我真的想把它写出来时“名称”。我怀疑它正在拿起“JsonProperty”。
有没有办法让它使用pname进行反序列化,但是使用原始属性值进行序列化?
谢谢!
答案 0 :(得分:3)
您可以创建自定义合约解析程序,将属性名称设置回您在服务之前在C#类中定义的属性名称。下面是一些示例代码;
class OriginalNameContractResolver : DefaultContractResolver
{
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
// Let the base class create all the JsonProperties
IList<JsonProperty> list = base.CreateProperties(type, memberSerialization);
// assign the C# property name
foreach (JsonProperty prop in list)
{
prop.PropertyName = prop.UnderlyingName;
}
return list;
}
}
像这样使用它;
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.Formatting = Formatting.Indented;
if (useLongNames)
{
settings.ContractResolver = new OriginalNameContractResolver();
}
string response = JsonConvert.SerializeObject(obj, settings);
答案 1 :(得分:0)
您可以使用一个Person
类编写自定义JsonConverter
,但我建议使用单独的类,因为这两个地方的数据建模方式不同。即使您现在不打算,也可能会发现自己需要从Name
反序列化或在某个时候序列化为pname
。这也使您的课程差别更大。您可以使用AutoMapper(或类似)轻松地在两者之间进行转换。 E.g。
public class PersonFromThatApi
{
[JsonProperty("pname")]
public string Name { get; set; }
}
public class Person
{
public string Name { get; set; }
}
Mapper.CreateMap<PersonFromThatApi, Person>();
Mapper.CreateMap<Person, PersonFromThatApi>();
var person1 = JsonConvert.DeserializeObject<PersonFromThatApi>(
@"{""pname"":""George""}");
Person person2 = Mapper.Map<Person>(person1);
string s = JsonConvert.SerializeObject(person2); // {"Name":"George"}
是的,Newtonsoft.Json
是Json.NET的命名空间。不要问我为什么他们为这两件事选择完全不同的名字。