当前位置: 首页 > 面试题库 >

如何将Json数组转换为C#中的对象列表

韩朝斑
2023-03-14
问题内容

我有如下的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);

但是我在序列化后得到空值,我该如何解决呢?


问题答案:

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

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

  1. Wrapper在您的JSON中添加了与外部对象相对应的类。
  2. 我改变了Values对财产ValueSet类从一个List<Value>Dictionary<string, Value>,因为values在你的JSON属性包含的对象,而不是一个数组
  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类中。然后,您可以ValueSet从获取Wrapper

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


 类似资料:
  • 问题内容: Json字符串: C#类: C#将json转换为电影的c#列表: 我的变量最终是一个计数为0的空列表。我是否缺少某些内容? 问题答案: 您的C#类映射与json结构不匹配。 解决方案:

  • 问题内容: 我从服务器得到一个 json数组: 我想使用gson将上面的json数据转换为Java 对象。我尝试了以下方法: 首先,我创建了一个 Person.java 类: 然后,在服务类中,我执行了以下操作: 我收到异常 java.lang.ClassCastException:java.util.LinkedHashMap无法强制转换为Person 。如何摆脱我的问题?我只想将json数组转

  • 问题内容: 我需要将JSON对象字符串转换为JavaScript数组。 这是我的JSON对象: 我想拥有: 我该如何实现? 问题答案: var json_data = {“2013-01-21”:1,”2013-01-22”:7}; var result = [];

  • 问题内容: 我有一个API请求,返回以下内容: 我想在单击按钮后使用以下代码显示获取的电影标题: 我的问题是,我收到一条错误消息,提示我只能遍历数组,并且我的数据是对象。如何在打字稿中将Object转换为Array,并在表格中显示电影的标题? 问题答案: 没错,您的回复是一个带有字段的对象: 因此,您实际上只想迭代该字段: …甚至更简单:

  • 这里是将上面的yaml文件转换为JSON对象,并尝试根据ID查找一张照片: 得到了以下结果: 问题:我怀疑在console.log(photoArray)的结果中获取“照片”导致我基于id的照片搜索失败。如何去除这个?我相信如果这个被移除,搜索和返回照片将会起作用

  • 我试图将下面的Json数组转换为特定的Java对象。 编辑:更新了正确的JSON结构 下面是我目前使用的对象映射器: 然而,我在尝试反序列化com时出错。fasterxml。杰克逊。数据绑定。exc.MismatchedInputException:无法反序列化来自数组值