如何在 JSON 序列化中跳过属性名?

6

我正在尝试将 List 转换为 json。结构如下:

public class ResourceCollection 
{
     public string Name { get; set; }
     public Resources Resources { get; set;}
}

public class Resources
{ 
    public string en { get; set; }
}

List<ResourceCollection> liResourceName = new List<ResourceCollection>();
//section to add the objects in list
string json = JsonConvert.SerializeObject(liResourceName, Newtonsoft.Json.Formatting.Indented);

这将按预期生成结果:
[
   {
     "Name": "Hello",
     "Resources": 
      {
        "en": "Hello" 
      }
   },
   {
     "Name": "World",
     "Resources": 
      {
        "en": "World"
      }
   }
]

我该如何获得类似以下的结果:-
{
  "Hello": {
    "en": "Hello"
  },
  "World": {
    "en": "World"
  }
}

你尝试过创建一个 Dictionary<string,object>,加载所需的信息,然后进行序列化吗? - Hanjun Chen
@Hanjun Chen 我对此有一些线索,但还没有尝试过。让我也试试。谢谢。 - Afnan Ahmad
1个回答

6
你需要创建一个自定义的JsonConverter,它知道如何处理序列化ResourceCollection
public class ResourceCollectionConverter : JsonConverter<List<ResourceCollection>> {
    public override bool CanRead {
        get {
            return false; //because ReadJson is not implemented
        }
    }

    public override List<ResourceCollection> ReadJson(JsonReader reader, Type objectType, List<ResourceCollection> existingValue, bool hasExistingValue, JsonSerializer serializer) {
        throw new NotImplementedException();
    }

    public override void WriteJson(JsonWriter writer, List<ResourceCollection> value, JsonSerializer serializer) {
        var obj = new JObject(); // { }

        foreach (var item in value) {
            //{ "Hello" : { "en": "Hello" } }
            obj[item.Name] = JObject.FromObject(item.Resources);
        }

        obj.WriteTo(writer);
    }
}

请使用转换器让JsonConvert知道如何处理序列化。
例如:
List<ResourceCollection> liResourceName = new List<ResourceCollection>();

liResourceName.Add(new ResourceCollection { Name = "Hello", Resources = new Resources { en = "Hello" } });
liResourceName.Add(new ResourceCollection { Name = "World", Resources = new Resources { en = "World" } });

var formating = Newtonsoft.Json.Formatting.Indented;
var converter = new ResourceCollectionConverter();
string json = JsonConvert.SerializeObject(liResourceName, formating , converter);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接