我在我的.net核心项目中使用了newtonsoft,并遇到了一种特殊的json格式。我有一个列表,序列化后得到的“普通”json是这样的:
{
"id": "0124",
"entities": [
{
"name": "chris",
"surname": "green"
},
{
"name": "albert",
"surname": "red"
}
]
}我需要将其转换为类似以下内容:
{
"id": "0124",
"entities": [
{
"chris": "green",
"albert": "red"
}
]
}我不知道我的列表中可能有多少个实体。
谢谢大家
编辑
感谢大家的帮助,代码如下:
var jsonBody = JsonConvert.SerializeObject(
new BulkRegisterDto
{
Id = "0124",
Entities = entities
}
);
public class BulkRegisterDto
{
[JsonProperty(PropertyName = "id")]
public string Id{ get; set; }
[JsonProperty(PropertyName = "entities")]
public IList<Person> Entities { get; set; }
}
public class Person
{
public string Name { get; set; }
public string Surname { get; set; }
}这些都不是真正的属性。我正在尝试使用动态JObject。我们将看看它是否有效。
发布于 2019-03-11 18:34:41
您可以将json反序列化为DTO:
[DataContract]
private class Person
{
[DataMember(Name = "name")]
public string Name { get; set; }
[DataMember(Name = "surname")]
public string Surname { get; set; }
}
[DataContract]
private class Entities
{
[DataMember(Name = "entities")]
public Person[] Persons { get; set; }
}然后用原始的JObject和JArray构建预期的json
var input = "{\r\n \"entities\": [\r\n {\r\n \"name\": \"chris\",\r\n \"surname\": \"green\"\r\n },\r\n {\r\n \"name\": \"albert\",\r\n \"surname\": \"red\"\r\n }\r\n ]\r\n}";
var json = JsonConvert.DeserializeObject<Entities>(input);
var root = new JObject();
var innerObject = new JObject();
root.Add("entities", new JArray {innerObject});
foreach (var entry in json.Persons)
innerObject.Add(entry.Name, entry.Surname);如果你调用root.ToString(),你会得到
{
"entities": [
{
"chris": "green",
"albert": "red"
}
]
} 发布于 2019-03-11 22:38:24
@Aleks Andreev我将你的答案设置为正确的,因为它解决了问题,但我更喜欢更好的方法,我使用@MindSwipe注释创建了我的自定义json转换器。
下面是我的代码:
public class BulkEntityConverter : JsonConverter
{
public override object ReadJson(
JsonReader reader,
Type objectType,
object existingValue,
JsonSerializer serializer)
{
var obj = (JObject)JObject.ReadFrom(reader);
JProperty property = obj.Properties().FirstOrDefault();
// I didn't use this method
return new BulkRegisterDto
{
Id = property.Name,
Entities = new List<Person>()
};
}
public override void WriteJson(
JsonWriter writer,
object value,
JsonSerializer serializer)
{
BulkRegisterDto permission = (BulkRegisterDto)value;
var innerEntities = new JObject();
foreach (var entry in permission.Entities)
{
innerEntities.Add(entry.Name, entry.Surname);
}
var root = new JObject
{
{ "id", permission.Id},
{ "entities", new JArray { innerEntities } }
};
root.WriteTo(writer);
}
public override bool CanConvert(Type t)
{
return typeof(BulkRegisterDto).IsAssignableFrom(t);
}
public override bool CanRead
{
get { return true; }
}
}使用这种方法,我可以获得一个清晰的类来使用我的json转换器,如下所示:
var jsonBody = JsonConvert.SerializeObject(manager, new BulkEntityConverter());其中manager是我的BulkRegisterDto对象
感谢所有的支持人员
https://stackoverflow.com/questions/55098291
复制相似问题