【问题标题】:convert array in json to c# dictionary将json中的数组转换为c#字典
【发布时间】:2023-03-15 19:33:01
【问题描述】:

我有这个 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","name": [{"id": "1","value": "something321"},{"id": "2","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"})才能正确反序列化。 ...

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

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

【问题讨论】:

标签: c# json deserialization json-deserialization


【解决方案1】:

我从您的示例中看到,您无法将 name 转换为 Dictionary 因为它是数组。 但是你可以做这样的事情。更改此行以包含 List:

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; }
    }

我不知道这是否是你所期望或想要的,但至少你会修复你目前遇到的错误。

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

【讨论】:

  • 没问题。如果它有帮助,请留下一个加号来回答。谢谢
【解决方案2】:

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

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; }
}

【讨论】:

  • 但是像“名称”这样的对象太多了,具有不同的字段,我正在寻找更通用的解决方案。希望它存在
猜你喜欢
  • 2011-09-28
  • 1970-01-01
  • 1970-01-01
  • 2018-05-04
  • 2019-04-19
  • 2017-01-19
  • 1970-01-01
相关资源
最近更新 更多