将JsonString列表转换为类对象

问题描述 投票:0回答:1

这是我的结果JSON

{
    "value": [
        {
            "name": "AAA",
            "Results": [
                "{\"name\":\"Maths\",\"type\":\"Person\",\"subType\":null}",
                "{\"name\":\"English\",\"type\":\"Person\",\"subType\":null}"
            ]
        },
        {
            "name": "BBB",
            "Results": [
                "{\"name\":\"Bio\",\"type\":\"Person\",\"subType\":null}",
                "{\"name\":\"Physics\",\"type\":\"Person\",\"subType\":null}"
            ]
        }
    ]
}

这是我的价值模型

public class ValueModel
{
public string name { get; set; }    
public List<string> Results { get; set; }
}

主要型号:

public class MainModel
{
public List<ValueModel> value {get;set;}
}

Result值始终采用JSON字符串格式,我无法更改。

现在我已经为结果创建了一个单独的类,如下所示

public class ResultModel
{
public string name {get;set;}
public string type {get;set;}
public string subType {get;set;}
}

我想要的只是将Results Jsonstring转换为ResultModel

到目前为止,我尝试了getter setter本身,但没有工作

public class ValueModel
{
public string name { get; set; }    
public List<string> Results { get; set; }
        [JsonIgnore]
        public List<ResultModel> ProperResults
        {           
            get
            {
                string json = JsonConvert.SerializeObject(Results , Formatting.Indented);
                return JsonConvert.DeserializeObject<List<ResultModel>>(json);
            }
        }
}

更新1 @Aleks解决方案工作得很好,但问题是我在结果JSON中有另一个像@odata.count这样的Json属性

{   "@odata.count": 2
    "value": [
        {
            "name": "AAA",
            "Results": [
                "{\"name\":\"Maths\",\"type\":\"Person\",\"subType\":null}",
                "{\"name\":\"English\",\"type\":\"Person\",\"subType\":null}"
            ]
        },
        {
            "name": "BBB",
            "Results": [
                "{\"name\":\"Bio\",\"type\":\"Person\",\"subType\":null}",
                "{\"name\":\"Physics\",\"type\":\"Person\",\"subType\":null}"
            ]
        }
    ]
}

所以我试着修改模板

var template = new { odataCount=0,value = new[] {new {name = "", Results = new string[0]}}};

哪个不工作bcos它无法映射@odata.count元素

c# list model
1个回答
1
投票

您的输入包含嵌套的Json,因此您应该在多次传递中反序列化它

你可以定义你的ValueModel

public class ValueModel
{
    public string name { get; set; }
    public List<ResultModel> Results { get; set; }
}

现在将您的输入反序列化为临时匿名对象:

var input = "{\r\n    \"value\": [\r\n        {\r\n            \"name\": \"AAA\",\r\n            \"Results\": [\r\n                \"{\\\"name\\\":\\\"Maths\\\",\\\"type\\\":\\\"Person\\\",\\\"subType\\\":null}\",\r\n                \"{\\\"name\\\":\\\"English\\\",\\\"type\\\":\\\"Person\\\",\\\"subType\\\":null}\"\r\n            ]\r\n        },\r\n        {\r\n            \"name\": \"BBB\",\r\n            \"Results\": [\r\n                \"{\\\"name\\\":\\\"Bio\\\",\\\"type\\\":\\\"Person\\\",\\\"subType\\\":null}\",\r\n                \"{\\\"name\\\":\\\"Physics\\\",\\\"type\\\":\\\"Person\\\",\\\"subType\\\":null}\"\r\n            ]\r\n        }\r\n    ]\r\n}";

var template = new {value = new[] {new {name = "", Results = new string[0]}}};
var mainModel = JsonConvert.DeserializeAnonymousType(input, template);

此时您可以获得预期的结果

var result = new MainModel
{
    value = mainModel.value.Select(x => new ValueModel
    {
        name = x.name,
        Results = x.Results.Select(JsonConvert.DeserializeObject<ResultModel>).ToList()
    }).ToList()
};


I don't know how to extract @odata.count in a single pass, but you can use JObject for this:
var jObject = JObject.Parse(input);
(int) jObject["@odata.count"]; // == 2
© www.soinside.com 2019 - 2024. All rights reserved.