将json中的数组转换为c#字典

问题描述

我有这个 json 字符串:

{"products": [{"id": 22,"date_add": "2021-06-17 19:21:26","date_upd": "2021-07-12 13:02:01","name": [{"id": "1","value": "Product 1"},{"id": "2","value": "Product 1"}]}},{"id": 1,"date_add": "2021-06-17 18:54:54","date_upd": "2021-06-17 18:54:54","value": "something321"},"value": "something23"}]}]}

和这个类:

class Products 
{
   [JsonProperty("id")]
   public override string ExternalId { get; set; }

   [JsonProperty("name")]
   public Dictionary<string,string> Name { get; set; }

   [JsonProperty("date_upd")]
   public DateTime DateModified{ get; set; }
} 

我想将我的 json 产品映射到产品列表,所以我尝试了这个:

// get "products" array from json
Regex regex = new Regex(@"(?:{""products"":)(.+)(?:})");
MatchCollection matches = regex.Matches(result);
if (matches.Count > 0)
{
   result = matches[0].Groups[1].Value;
}
else
{
   result = null;
}
//
var deserialized = JsonConvert.DeserializeObject<List<PrestaProducts>>(result);

它抛出:Newtonsoft.Json.JsonSerializationException:'无法将当前 JSON 数组(例如 [1,2,3])反序列化为类型'System.Collections.Generic.Dictionary`2[System.String,System.String] ' 因为该类型需要一个 JSON 对象(例如 {"name":"value"})才能正确反序列化。 ...

好的 - 如果我将名称类型设置为对象,它会正常工作并设置匿名对象列表。 ( public object Name { get; set; } )

但是我如何将这些名称设置为字典?

解决方法

您可以将其转换为列表产品

var jsonObj = JsonConvert.DeserializeObject<JsonObjects>(json);
var productObjects = jsonObj.products;

如果你想把它转换成字典,试试这个:

var products = new Products { products = new List<Product> { } };

    foreach (var item in productObjects)
    {
        var product = new Product
        {
            id = item.id,date_add = item.date_add,date_upd = item.date_upd,name=new Dictionary<string,string>()
        };
        
        foreach (var name in item.name)
        {
            product.name.Add(name.id,name.value);
        }
            products.products.Add(product);
    }

    var productsJson= JsonConvert.SerializeObject( products);
    

输出

{"products":[
{"id":22,"date_add":"2021-06-17 19:21:26","date_upd":"2021-07-12 13:02:01","name":{"1":"Product 1","2":"Product 1"}},{"id":1,"date_add":"2021-06-17 18:54:54","date_upd":"2021-06-17 18:54:54","name":{"1":"Hummingbird printed t-shirt","2":"Hummingbird printed t-shirt"}}
]}

课程

public class Name
{
    public string id { get; set; }
    public string value { get; set; }
}


public class JsonProduct
{
    public int id { get; set; }
    public string date_add { get; set; }
    public string date_upd { get; set; }
    public List<Name> name { get; set; }
}

public class JsonObjects
{
    public List<JsonProduct> products { get; set; }
}
public class Product
{
    public int id { get; set; }
    public string date_add { get; set; }
    public string date_upd { get; set; }
    public Dictionary<string,string> name { get; set; }
}

public class Products
{
    public List<Product> products { get; set; }
}
,

我从你的例子中看到,你不能将 name 转换为 Dictionary 因为它是数组。 但是你可以做这样的事情。将此行更改为包含列表:

var deserialized = JsonConvert.DeserializeObject<List<Products>>(result);

并将您的模型更改为如下所示:

public class Products
    {
        [JsonProperty("id")]
        public string ExternalId { get; set; }

        [JsonProperty("name")]
        public List<Dictionary<string,string>> Name { get; set; }

        [JsonProperty("date_upd")]
        public DateTime DateModified { get; set; }
    }

我不知道这是否是您期望或想要的,但至少您会解决目前的错误。

对我来说,在列表中包含字典没有多大意义,但您不能以您尝试过的方式直接将数组转换为字典。