【问题标题】:Adding Class Name in JSON using C#使用 C# 在 JSON 中添加类名
【发布时间】:2015-07-04 11:03:20
【问题描述】:

我使用 JSON.NET 在 Person 类的 JSON 下面创建了但是“Person”没有出现在 JSON 中的任何地方。我认为它应该在一开始就出现。有什么问题或如何解决?谢谢你。

[
  {
    "Name": "Umer",
    "Age": 25
  },
  {
    "Name": "Faisal",
    "Age": 24
  }
]

这里是生成 JSON 的 C# 代码

List<Person> eList = new List<Person>();
Person a = new Person("Umer",25);
Person b = new Person("Faisal", 24);
eList.Add(a);
eList.Add(b);
string jsonString = JsonConvert.SerializeObject(eList,Formatting.Indented);

【问题讨论】:

标签: c# json


【解决方案1】:

您需要添加一个TypeNameHandling 设置:

List<Person> eList = new List<Person>();
Person a = new Person("Umer", 25);
Person b = new Person("Faisal", 24);
eList.Add(a);
eList.Add(b);
string jsonString = JsonConvert.SerializeObject(eList, Formatting.Indented,
    new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All });

这样每个 JSON 对象都会有一个额外的字段“$type”:

[
    {
        "$type" : "YourAssembly.Person"
        "Name" : "Umer",
        "Age" : 25
    },
    ...
]

更多详情请见the documentation

【讨论】:

    【解决方案2】:

    这样没有问题,可以这样反序列化。

    你可以这样反序列化它:

    Person deserialized = (Person)JsonConvert.DeserializeObject( serializedText ,typeof(Person))
    

    但如果您需要根 this 问题可能会有所帮助。

    【讨论】:

    • 他不是在询问反序列化,据我所知,他希望 json 的根以 Person 这个词开头
    【解决方案3】:

    试试

    var Person = new List<Person>();
    Person a = new Person("Umer", 25);
    Person b = new Person("Faisal", 24);
    Person.Add(a);
    Person.Add(b);
    
    var collection = Person;
    dynamic collectionWrapper = new {
      myRoot = collection
    };
    
    var output = JsonConvert.SerializeObject(collectionWrapper);
    

    【讨论】:

    • var collection = Person 行中,您的意思是改为输入"Person",即字符串?
    【解决方案4】:

    如果您真的希望类名作为 JSON 的一部分,您可以使用匿名类重新创建列表,然后将其序列化。

    var persons = eList.Select(p => new { Person = p }).ToList();
    var json = JsonConvert.SerializeObject(persons, Formatting.Indented);
    

    输出:

    【讨论】:

    • eList.Select(p =&gt; new { Person = p }) 不够吗?我们知道每个 person 对象都被正确地序列化了。我们只需要将每个对象键入字符串“Person”。如果我遗漏了什么,请纠正我。
    • @AmithGeorge 你说得对。我编辑了我的答案,谢谢。
    猜你喜欢
    • 2020-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-14
    • 2015-09-11
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    相关资源
    最近更新 更多