我在我的.net核心项目中使用newtonsoft并遇到了一种特殊的json格式。我有一个列表,序列化后出现的’正常’json是这样的:
{ “ID”: ”…
@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对象
manager
感谢所有支持人员
您可以将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; } }
然后使用raw构建预期的json JObject 和 JArray
JObject
JArray
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() 你会得到
root.ToString()
{ "entities": [ { "chris": "green", "albert": "red" } ] }