我从API收到类似以下结果:
[{
"propID": 1,
"propname": "nameA",
"dataType": "N",
"value": "9"
},
{
"propID": 2,
"propname": "nameB",
"dataType": "VL",
"value": "dasdsa"
},
{
"propID": 3,
"propname": "nameC",
"dataType": "N",
"value": "7"
},
{
"propID": 4,
"propname": "nameD",
"dataType": "VL",
"value": "jmfidsnjfs"
}
]
我正在获取并将其解码为DTO,以便可以将数字值转换为数字。 我的DTO看起来像:
public class PropertyToInsertDto
{
[JsonIgnore]
public int propID { get; set; }
public string propname { get; set; }
[JsonIgnore]
public string dataType { get; set; }
[JsonIgnore]
public string value { get; set; }
public string valueString { get; set; }
public float valueInt { get; set; }
}
因此,假设我将API存储到名为 result 的字符串变量中,我将使用
对其进行解码var properties = JsonConvert.DeserializeObject<List<PropertyToInsertDto>>(result);
,然后迭代每个属性以将其转换为数值
foreach(var property in properties) {
if (string.IsNullOrEmpty(property.value))
continue;
if (property.dataType == "N") {
property.valueInt = float.Parse(property.value);
} else {
property.valueString = property.value;
}
}
我想将其转换为Json,所以结果是
{"nameA": 9, "nameB":"dasdsa", "nameC":7, "nameD": "jmfidsnjfs"}
我尝试使用JsonConvert的SerializeObject方法,但未取得任何良好结果。 我最大的问题是由于结果可能来自valueInt或valueString,具体取决于它是数字还是文本。
谢谢!
古诺
答案 0 :(得分:2)
首先,您忽略了“ value”属性,因此JsonConvert不会反序列化此属性,并且始终具有默认值。
[JsonIgnore]
public string value { get; set; }
在此DTO中不需要“ valueString”和“ valueInt”,因为您正在更改对象结构,所以需要分开的DTO进行读写。
您可以使用以下代码获得预期结果:
var properties = JsonConvert.DeserializeObject<List<PropertyToInsertDto>>(str);
var result = JsonConvert.SerializeObject(properties.ToDictionary(
x => x.propname,
x => x.dataType == "N" ? (object)float.Parse(x.value) : x.value));
答案 1 :(得分:0)
您可以创建字典,然后将其转换为json:
https://www.newtonsoft.com/json/help/html/SerializeDictionary.htm
可以使用object代替int类型作为值。甚至对于数字类型也可以使用字符串,但是在以后的操作中反序列化时必须使用自定义转换类型。
这可能也有帮助:
Serializing/Deserializing Dictionary of objects with JSON.NET