繁体   English   中英

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

[英]How to convert Json array to list of objects in c#

我有像下面这样的 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. 我在你的 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# 类。

然后我打电话给:

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 values 对象,其属性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#

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM