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>()});
});
我有这个 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>()});
});