如何在 c# 中将 Json 数组转换为对象列表

本文关键字:转换 对象 列表 数组 Json 中将 | 更新日期: 2023-09-27 18:36:53

我有如下所示的 Json 字符串

 {
"JsonValues":{
        "id": "MyID",
         "values": {
            "value1":{
                "id": "100",
                "diaplayName": "MyValue1"
            },
            "value2":{
                "id": "200",
                "diaplayName": "MyValue2"
            }
       }
}
}

我想将 Json 字符串转换为下面的类

  class ValueSet
   {
    [JsonProperty("id")]
    public string id
    {
        get;
        set;
    }
    [JsonProperty("values")]
    public List<Value> values
    {
        get;
        set;
    }
  }
class Value
{
    public string id
    {
        get;
        set;
    }
    public string DiaplayName
    {
        get;
        set;
    }
}

我的反序列化代码是

JavaScriptSerializer js = new JavaScriptSerializer();
        StreamReader sr = new StreamReader(@"ValueSetJsonString.txt");
        string jsonString = sr.ReadToEnd();
        var items = JsonConvert.DeserializeObject<ValueSet>(jsonString);

但是我在序列化后得到空值,我该如何解决这个问题?

如何在 c# 中将 Json 数组转换为对象列表

正如其他人已经指出的那样,您没有得到预期结果的原因是您的 JSON 与您尝试反序列化的类结构不匹配。 您要么需要更改 JSON,要么需要更改类。 由于其他人已经展示了如何更改 JSON,因此我将在这里采取相反的方法。

为了匹配您在问题中发布的 JSON,您的类应按如下所示定义。 请注意,我进行了以下更改:

  1. 我在 JSON 中添加了一个与外部对象对应的Wrapper类。
  2. 我将 ValueSet 类的 Values 属性从List<Value>更改为Dictionary<string, Value>,因为 JSON 中的 values 属性包含一个对象,而不是数组。
  3. 我添加了一些额外的[JsonProperty]属性来匹配 JSON 对象中的属性名称。

类定义:

class Wrapper
{
    [JsonProperty("JsonValues")]
    public ValueSet ValueSet { get; set; }
}
class ValueSet
{
    [JsonProperty("id")]
    public string Id { get; set; }
    [JsonProperty("values")]
    public Dictionary<string, Value> Values { get; set; }
}
class Value
{
    [JsonProperty("id")]
    public string Id { get; set; }
    [JsonProperty("diaplayName")]
    public string DisplayName { get; set; }
}

您需要反序列化为 Wrapper 类,而不是 ValueSet 类。 然后,您可以从Wrapper获取ValueSet

var valueSet = JsonConvert.DeserializeObject<Wrapper>(jsonString).ValueSet;

这是一个工作程序来演示:

class Program
{
    static void Main(string[] args)
    {
        string jsonString = @"
        {
            ""JsonValues"": {
                ""id"": ""MyID"",
                ""values"": {
                    ""value1"": {
                        ""id"": ""100"",
                        ""diaplayName"": ""MyValue1""
                    },
                    ""value2"": {
                        ""id"": ""200"",
                        ""diaplayName"": ""MyValue2""
                    }
                }
            }
        }";
        var valueSet = JsonConvert.DeserializeObject<Wrapper>(jsonString).ValueSet;
        Console.WriteLine("id: " + valueSet.Id);
        foreach (KeyValuePair<string, Value> kvp in valueSet.Values)
        {
            Console.WriteLine(kvp.Key + " id: " + kvp.Value.Id);
            Console.WriteLine(kvp.Key + " name: " + kvp.Value.DisplayName);
        }
    }
}

这是输出:

id: MyID
value1 id: 100
value1 name: MyValue1
value2 id: 200
value2 name: MyValue2

http://json2csharp.com/

我发现上面的链接非常有用,因为它通过从实际返回的 JSON 生成它们的 C# 类来纠正我的 C# 类。

然后我打电话给:

JsonConvert.DeserializeObject<RootObject>(jsonString); 

一切都按预期工作。

您是否检查过此行工作正常并且您的字符串在其中具有值?

string jsonString = sr.ReadToEnd();

如果是,请尝试最后一行的以下代码:

ValueSet items = JsonConvert.DeserializeObject<ValueSet>(jsonString);

或者如果你有一个 JSON 数组,你可以像这样使用列表:

List<ValueSet> items = JsonConvert.DeserializeObject<List<ValueSet>>(jsonString);

祝你好运

您的数据

结构和 JSON 不匹配。

你的 JSON 是这样的:

{
    "JsonValues":{
        "id": "MyID",
        ...
    }
}

但是您尝试将其序列化为的数据结构是这样的:

class ValueSet
{
    [JsonProperty("id")]
    public string id
    {
        get;
        set;
    }
    ...
}

您跳过了一个步骤:您的 JSON 是一个具有一个名为 JsonValues 的属性的类,该属性将ValueSet数据结构的对象作为值。

同样在你的类中,你的JSON是这样的:

"values": { ... }

您的数据结构是这样的:

[JsonProperty("values")]
public List<Value> values
{
    get;
    set;
}

请注意,JSON 中的{ .. }定义了一个对象,其中 as [ .. ] 定义了一个数组。因此,根据您的 JSON,您没有一堆值,但您有one值对象,其属性为 value1value2 类型为 Value

由于反序列化程序需要一个数组,但获取了一个对象,因此它可以执行最少的非破坏性(异常)操作:跳过值。您的属性values保留其默认值:null

如果可以:调整 JSON。以下内容将匹配您的数据结构,并且很可能是您实际想要的:

{
    "id": "MyID",
     "values": [
         {
            "id": "100",
            "diaplayName": "MyValue1"
         }, {
            "id": "200",
            "diaplayName": "MyValue2"
         }
     ]
}

JSON 转换为 C# 类 = https://json2csharp.com/json-to-csharp

架构出来后

        WebClient client = new WebClient();
        client.Encoding = Encoding.UTF8;
        string myJSON = client.DownloadString("http://xxx/xx/xx.json");
        var valueSet = JsonConvert.DeserializeObject<Root>(myJSON);

我们最大的错误之一是我们无法将类结构与 json 匹配。

此连接将自动执行该过程。稍后您将对其进行编码;) = https://json2csharp.com/json-to-csharp

就是这样。

你有一个不匹配的jSon字符串,如果你想转换成一个列表,试试这个

{
    "id": "MyID",
     "values": [
        {
            "id": "100",
            "diaplayName": "MyValue1",
        },
        {
            "id": "200",
            "diaplayName": "MyValue2",
        }
   ]    
}
这也是

可能的:

using System.Web.Helpers;
var listOfObjectsResult = Json.Decode<List<DataType>>(JsonData);

这将采用 JsonElement 并将其反序列化为对象列表。

List<object> draftInvoices = JsonConvert.DeserializeObject<List<object>>(jsonDrafts.ToString());

例:

[HttpPost]
        [Route("CreateDraft")]
        public async Task<IActionResult> CreateDraft([FromBody] JsonElement jsonDrafts)
        {
            List<object> draftInvoices = JsonConvert.DeserializeObject<List<object>>(jsonDrafts.ToString());
             
          
                for (int i = 0; i < draftInvoices.Count; i++) 
                 {
                  ........
                 }  
您可以使用

Json.Net 框架来执行此操作。就像这样:

Account account = JsonConvert.DeserializeObject<Account>(json);

首页 : http://json.codeplex.com/

关于此的文档:http://james.newtonking.com/json/help/index.html#