如何使用JSON.NET为含多字符串及字符串数组的Model创建索引?
如何使用JSON.NET为你的Graphs模型设置序列化索引(属性顺序)
看起来你想要控制Graphs类在序列化为JSON时的属性顺序(也就是你说的“创建索引”),JSON.NET(Newtonsoft.Json)提供了几种简单的方式来实现这个需求,结合你的模型代码,我给你两种常用方案:
方案一:直接用JsonProperty的Order属性
这是最直接的方式,给每个标记了[JsonProperty]的属性指定Order值,数值越小,该属性在最终JSON里的位置就越靠前。
修改你的模型代码如下:
namespace ReinovaGrafieken.Models { [JsonObject(MemberSerialization.OptIn)] public class Graphs { [JsonProperty(Order = 1)] public string Names { get; set; } [JsonProperty(Order = 2)] public string[] AnswerHeaders { get; set; } [JsonProperty(Order = 3)] public string[] AnswersOne { get; set; } [JsonProperty(Order = 4)] public string[] AnswersTwo { get; set; } [JsonProperty(Order = 5)] public string[] AnswersThree { get; set; } // 后续新增的属性可以继续递增Order数值,比如Order=6、7... } }
注意:如果某个属性没设置Order,它的默认值是0,会排在所有指定了Order的属性前面。如果多个属性Order值相同,会按照它们在类中的定义顺序排列。
方案二:自定义ContractResolver(适合批量控制)
如果你的模型有大量属性,不想一个个手动加Order,可以自定义一个契约解析器,统一控制属性的排序逻辑:
第一步:创建自定义解析器
public class GraphsContractResolver : DefaultContractResolver { protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) { // 获取所有属性 var properties = base.CreateProperties(type, memberSerialization); // 按照你想要的顺序排序 var orderedProperties = properties.OrderBy(p => p.PropertyName switch { nameof(Graphs.Names) => 1, nameof(Graphs.AnswerHeaders) => 2, nameof(Graphs.AnswersOne) => 3, nameof(Graphs.AnswersTwo) => 4, nameof(Graphs.AnswersThree) => 5, // 其他属性可以在这里补充排序规则 _ => 100 // 未指定的属性统一排在最后 }).ToList(); return orderedProperties; } }
第二步:序列化时使用该解析器
// 实例化你的模型 var graphs = new Graphs { Names = "Sample Name", AnswerHeaders = new[] {"Header1", "Header2"}, // 其他属性赋值... }; // 设置序列化配置 var jsonSettings = new JsonSerializerSettings { ContractResolver = new GraphsContractResolver(), Formatting = Formatting.Indented // 可选,格式化输出JSON }; // 序列化 string json = JsonConvert.SerializeObject(graphs, jsonSettings);
补充:如果是为JSON数据创建查询索引
如果你说的“创建索引”是指序列化后快速查询JSON中的属性,那可以把JSON解析为JObject,利用它的索引器直接访问:
// 假设已经得到了序列化后的json字符串 JObject jsonObj = JObject.Parse(json); // 直接通过属性名访问 string namesValue = (string)jsonObj["Names"]; JArray answerHeadersArray = (JArray)jsonObj["AnswerHeaders"]; // 遍历数组 foreach (var header in answerHeadersArray) { Console.WriteLine(header.ToString()); }
内容的提问来源于stack exchange,提问作者Carlove
相关产品推荐
相关产品推荐

