我想序列化属性,但每个属性都包含在一个单独的JSON对象中。
以下示例:
public class Metadata
{
public string Name { get; set; }
public Guid Id { get; set; }
}
public void SerializeCars()
{
var data = new Metadata { Name = "MyName", Id = Guid.NewGuid() };
var json = JsonConvert.SerializeObject(data, Formatting.Indented);
}
目前的结果将是:
{
"Name": "MyName",
"Id": "f9c4bc06-0b99-47ff-b22b-ea094fc188ee"
}
我希望它(上面缺少“td”类):
{
"td": [{
"name": "myName"
}, {
"id": "f9c4bc06-0b99-47ff-b22b-ea094fc188ee"
}]
}
可以修复吗?
答案 0 :(得分:1)
您可以创建自定义JsonConverter以获得所需的输出:
class MetadataConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return (objectType == typeof(Metadata));
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
JArray array = new JArray();
foreach (PropertyInfo pi in value.GetType().GetProperties().Where(p => p.CanRead))
{
array.Add(new JObject(new JProperty(pi.Name, pi.GetValue(value, null))));
}
JObject obj = new JObject(new JProperty("td", array));
obj.WriteTo(writer);
}
public override bool CanRead
{
get { return false; }
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
然后,像这样使用它:
var json = JsonConvert.SerializeObject(data, Formatting.Indented, new MetadataConverter());
答案 1 :(得分:-1)
如果需要它以这种方式序列化,请尝试对序列化字符串进行一些后处理。请记住,在反序列化之前,如果没有一些处理,这将不会反序列化。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft;
using Newtonsoft.Json.Linq;
namespace ConsoleApplication1
{
public class Metadata
{
public string Name { get; set; }
public Guid Id { get; set; }
}
public class Root
{
public List<Metadata> listOfMetadata{get;set;}
}
class Program
{
static void Main(string[] args)
{
Run run = new Run();
run.SerializeCars();
}
}
public class Run
{
public void SerializeCars()
{
var root = new Root()
{
listOfMetadata = new List<Metadata>()
{
new Metadata
{
Name = "MyName", Id = Guid.NewGuid()
}
}
};
var json = JsonConvert.SerializeObject(root, Formatting.Indented);
json = json.Replace("\"listOfMetadata\": ", string.Empty);
Console.WriteLine(json);
Console.ReadKey();
}
}
}