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

时间:2018-01-27 16:17:19

标签: c# json.net json-deserialization

我有这个json文件:

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

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

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

显示成员我想让它成为对象上出现的第一个属性的值。那样:

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

将返回

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

我以为我可以使用

[JsonProperty(Order = 0)]

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

2 个答案:

答案 0 :(得分:0)

Inconsitent 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() }));

<强> Consitent

如果有联系,那么创建一个C#类来表示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 }));

答案 1 :(得分:0)

使用Newtonsoft.Json.Linq.JArray

采取所有JTokens

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>()});    
     });