C# 将动态json对象反序列化为类

C# 将动态json对象反序列化为类,c#,.net,asp.net-core,json-deserialization,C#,.net,Asp.net Core,Json Deserialization,我正在使用一个外部API来获取一些产品信息,端点以静态结构返回一些数据,而其他数据则以动态形式返回,具体取决于我查询的产品 例如,如果我为soap请求数据,我会得到以下JSON: {“id”:4623, “品牌”:“Fa”, “类别”:“清洁/洗涤/肥皂-身体”, “照片”:{ “姓名”:“照片”, “值”:[“https//test.com/1jpg” ] }, “产品名称”:{ “名称”:“产品名称”, “价值”:“Fa沐浴乳酸奶香草蜂蜜” }, “警告声明”:{ “名称”:“警告声明”,

我正在使用一个外部API来获取一些产品信息,端点以静态结构返回一些数据,而其他数据则以动态形式返回,具体取决于我查询的产品

例如,如果我为soap请求数据,我会得到以下JSON:

{“id”:4623,
“品牌”:“Fa”,
“类别”:“清洁/洗涤/肥皂-身体”,
“照片”:{
“姓名”:“照片”,
“值”:[“https//test.com/1jpg”
]
},
“产品名称”:{
“名称”:“产品名称”,
“价值”:“Fa沐浴乳酸奶香草蜂蜜”
},
“警告声明”:{
“名称”:“警告声明”,
“值”:“避免与眼睛接触。”
},
“consumerusageinstructions”:{
“名称”:“消费者使用说明”,
“值”:“直接涂抹在皮肤上。”
}
如果我询问奶酪,我会得到以下JSON:

{
“id”:10838,
“品牌”:“多米”,
“类别”:“奶酪”,
“照片”:{
“姓名”:“照片”,
“值”:[”https://test.com/2.jpg"
]
},
“产品名称”:{
“名称”:“产品名称”,
“价值”:“多米白色低盐奶酪”
},
“说明”:{
“名称”:“1312”,
“价值”:“最高优质”
},
“网络内容”:{
“名称”:“网络内容”,
“价值”:“900克”
}
他们提供的每一种产品都是如此。我对静态数据(如照片数组、产品名称、品牌和id)进行反序列化没有问题,因为它们适用于每一种产品,但我关心的是其他动态属性。有没有办法反序列化到这样的类:

公共类信息{
属性字符串键{get;set;}//用于保存描述、consumerusageinstructions或每个键的内容
属性字符串名称{get;set;}
属性字符串值{get;set;}
}

然后将类信息集合添加到我的产品模型中?

一种方法就是解析Json并查看实际实体:此示例使用Json.Net:

var parsed = JObject.Parse(json);
var properties = parsed.Children().Cast<JProperty>();
foreach (var property in properties) {
    
    // an alternative here would be to just have a list of names to ignore
    if (!(property.Value is JObject jObject)) {
        // skip the simple property/value pairs
        continue;
    }

    if (property.Name == "productname") {
        // skip product name
        continue;
    }

    if (property.Value["value"] is JArray) {
        // skip photos
        continue;
    }

    // Add to ProductModel instance
    Console.WriteLine($"{property.Name} => {property.Value["name"]} = {property.Value["value"]}");

}
var parsed=JObject.Parse(json);
var properties=parsed.Children().Cast();
foreach(属性中的var属性){
//这里的另一种选择是只列出一个可以忽略的名字列表
如果(!(property.Value为JObject-JObject)){
//跳过简单的属性/值对
继续;
}
如果(property.Name==“productname”){
//跳过产品名称
继续;
}
如果(property.Value[“Value”]是JArray){
//跳过照片
继续;
}
//添加到ProductModel实例
Console.WriteLine($“{property.Name}=>{property.Value[“Name”]}={property.Value[“Value”]}”);
}
产出:

警告声明=>警告声明=避免与眼睛接触。
consumerusageinstructions=>Consumer Usage Instructions=直接涂抹在皮肤上

description=>1312=最高优质
净含量=>净含量=900克


你尝试过将特殊的粘贴作为Json类吗?是的,对于它们中的大多数,每个产品都有不同的属性,并且随着时间的推移,一些属性会随着添加更多产品而改变,我不想每次添加或更新产品时都改变我的代码,想想odes milk、chees、soap、Tobacco、TV、mobiles、computers都有不同的属性租赁属性,这就是为什么我要将它们存储为(键、名称、值)的集合…您始终可以将json反序列化为
动态
字典
,或仅将json反序列化为
作业对象
/
JsonObject
…这取决于以后的使用情况我考虑过使用字典,但我无法将json反序列化为我的ProductModel类中的Dictionary属性,然后您必须编写自定义JsonConverter