根据对象列表创建key:value Json

时间:2019-05-20 07:24:27

标签: c# .net

我从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,具体取决于它是数字还是文本。

谢谢!

古诺

2 个答案:

答案 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