将我的JSON反序列化为POCO,而不是填充几个字段



我有下面的json,需要在C#-中进行反序列化

{
"clientSettings":[
{
"clientId":12345,
"entries":[
{
"key":"abc",
"value":false
},
{
"key":"def",
"value":false
},
{
"key":"ghi",
"value":false
}
]
},
{
"clientId":9876,
"entries":[
{
"key":"lkmn",
"value":false
}
]
}
],
"productSettings":[
{
"productId":11,
"entries":[
{
"key":"jkl",
"value":true
},
{
"key":"mno",
"value":true
}
]
},
{
"productId":12,
"entries":[
{
"key":"jkl",
"value":true
},
{
"key":"mno",
"value":true
}
]
}
],
"customerSettings":[
{
"key":"enableData",
"value":false
},
{
"key":"minPriceValue",
"value":"10.28"
},
{
"key":"presentData",
"value":"AEGIS"
}
],
"thothTest":{
"9876":[
"K"
],
"5431":[
"A",
"L"
],
"5123":[
"L"
]
},
"osirisTest":{
"7678":[
"K"
]
}
}

下面是我创建的类,用于将json反序列化为-

public class ProcessHolder : Holder
{
public IDictionary<int, ISet<string>> OsirisTest { get; set; }
public IDictionary<int, ISet<string>> ThothTest { get; set; }
}
public class Holder
{
public IList<Mapping> CustomerSettings { get; set; }
public IList<ClientSettingsMapping> ClientSettings { get; set; }
public IList<ProductSettingsMapping> ProductSettings { get; set; }
}
public class Mapping
{
public string Key { get; set; }
public object Value { get; set; }
}
public class ProductSettingsMapping : Mapping
{
public int ProductId { get; set; }
}
public class ClientSettingsMapping : Mapping
{
public int ClientId { get; set; }
}
  • 我想将所有customerSettings值加载到Holder类的CustomerSettings对象中
  • 类似地,我想将所有clientSettings值加载到Holder类的ClientSettings对象中
  • 类似地,将所有的productSettings值放入Holder类的ProductSettings对象中
  • 类似地,CCD_ 11值被转换为CCD_ 12,并且CCD_ 13值被转换成CCD_ 14对象

我尝试使用以下代码,但在反序列化上述json后,不知何故,我看不到KeyValue变量填充在Mapping类对象内。

private static readonly JsonSerializerSettings serializerSettings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver(),
NullValueHandling = NullValueHandling.Ignore
};
public static void Main(string[] args)
{
var jsonContent = File.ReadAllText("/beta/Downloads/test.json");
var config = JsonConvert.DeserializeObject<ProcessHolder>(jsonContent, serializerSettings);
if (config == null)
{
Console.WriteLine("Some Parsing Issue");
}
// using config object here
}

我在这里做什么不对?我只需要将我的json反序列化为上面的类,并将ProcessHolder对象还给我,我以后可以使用它

查看JSON,clientSettingsproductSettings具有entries数组。在相同的类定义中并没有相应的匹配属性。我建议根据JSON修改您的类定义。试试下面,看看它是否有帮助:

public class ProductSettingsMapping 
{
public int ProductId { get; set; }
public IList<Mapping> Entries { get; set; }
}
public class ClientSettingsMapping 
{
public int ClientId { get; set; }
public IList<Mapping> Entries { get; set; }
}

第二个选项-如果不能修改类,可以修改JSON。我正在为clientSettings提供样品

{
"clientSettings": [
{
"clientId": 12345,
"key": "abc",
"value": false
}, 
{
"clientId": 12345,
"key": "def",
"value": false
}, 
{
"clientId": 12345,
"key": "ghi",
"value": false
},
{
"clientId": 9876,    
"key": "lkmn",
"value": false
}
]
}

您可以相应地更新productSettings

第三个选项是解析为JObject,然后转换为您的类。clientSettings样品

static void Main(string[] args)
{
var json = "{'clientSettings':[{'clientId':12345,'entries':[{'key':'abc','value':false},{'key':'def','value':false},{'key':'ghi','value':false}]},{'clientId':9876,'entries':[{'key':'lkmn','value':false}]}],'productSettings':[{'productId':11,'entries':[{'key':'jkl','value':true},{'key':'mno','value':true}]},{'productId':12,'entries':[{'key':'jkl','value':true},{'key':'mno','value':true}]}],'customerSettings':[{'key':'enableData','value':false},{'key':'minPriceValue','value':'10.28'},{'key':'presentData','value':'AEGIS'}],'thothTest':{'9876':['K'],'5431':['A','L'],'5123':['L']},'osirisTest':{'7678':['K']}}";
var parsed = JObject.Parse(json);
var parsedClientSettings = parsed["clientSettings"];
List<ClientSettingsMapping> clientSettings = new List<ClientSettingsMapping>();
foreach (var parsedClientSetting in parsedClientSettings)
{
var clientId = parsedClientSetting.Value<int>("clientId");
foreach (var entry in parsedClientSetting["entries"])
{
clientSettings.Add(new ClientSettingsMapping { ClientId = clientId, Key = entry["key"].ToString(), Value = entry["value"].ToString() });
}
}
ProcessHolder processHolder = new ProcessHolder() { ClientSettings = clientSettings };
Console.ReadLine();
}

您应该定义"条目";在ProductSettingsMapping和ClientSettingsMapping类中。

public class ProductSettingsMapping 
{
public int ProductId { get; set; }
public IList<Mapping> entries { get; set; }
}
public class ClientSettingsMapping 
{
public int ClientId { get; set; }
public IList<Mapping> entries { get; set; }
}

最新更新