JArray 仅将第一个 属性 值反序列化为对象

JArray Deserialize only first property value to Object

我有这个 json 文件:

[
    {
        "blah" : "some text here",
        "hidden" : false,
    },
    {
        "blah" : "some other text",
        "hidden" : false,
    }
]

我将它加载到 JArray 中,然后我想使用 ToObject 方法将数据反序列化为自定义 Class:

public class LookupItem
{
    public string DisplayMember { get; set; }
}

显示成员我希望它是出现在对象上的第一个 属性 的值。这样:

var a = myJArray.ToObject(List<LookupItem>);

会return

a[0].DisplayMember  --->  some text here
a[1].DisplayMember  --->  some other text

我想我可以用一个

[JsonProperty(Order = 0)]

属性,但它似乎不适用于序列化的反序列化。 (真正的问题是我事先不知道第一个 属性 的键值)。

不一致JSON

如果你的 JSON 没有一致性,你可以将整个东西反序列化为一个对象。

var items = JsonConvert.DeserializeObject("Your JSON"));

然后将其转换为 JContainer 并循环遍历它并创建您的 LookupItem 对象。下面的代码假定第一个 属性 是您想要的:

var luItems = new List<LookupItem>();
var item = ((Newtonsoft.Json.Linq.JContainer)items).ToList()[0];
((Newtonsoft.Json.Linq.JContainer)items).ToList().ForEach(x => 
    luItems.Add(new LookupItem { DisplayMember = x.First.First().ToString() }));

一致

如果有一致性,则创建一个 C# class 来表示您的 JSON:

的对象
public class Class1
{
    public string blah { get; set; }
    public bool hidden { get; set; }
}

然后反序列化并创建 LookupItem 个实例:

var consitentItems = JsonConvert.DeserializeObject<Class1[]>(File.ReadAllText("Files/Json.txt"));
var consistentLookupItems = new List<LookupItem>();
consitentItems.ToList().ForEach(x => 
    consistentLookupItems.Add(new LookupItem { DisplayMember = x.blah }));

使用 Newtonsoft.Json.Linq.JArray

获取所有 JToken

Newtonsoft.Json.Linq.JArray jarr = (Newtonsoft.Json.Linq.JArray)(JsonConvert.DeserializeObject(yourJsonScript));
List<LookupItem> myList= New List<LookupItem>();
jarr.ToList().ForEach(jtoken =>
     {
       myList.Add(new LookupItem(){DisplayMember=jtoken.ElementAt(0).ToObject<string>()});    
     });