C# 基于对象列表创建key:value Json

C# 基于对象列表创建key:value Json,c#,.net,C#,.net,我从API收到的结果类似于: [{ "propID": 1, "propname": "nameA", "dataType": "N", "value": "9" }, { "propID": 2, "propname": "nameB", "dataType": "VL", "value": "dasdsa" }, {

我从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);
我想将其转换为Json,因此结果是

{"nameA": 9, "nameB":"dasdsa", "nameC":7, "nameD": "jmfidsnjfs"}
我尝试使用JsonConvert中的SerializeObject方法,但没有得到任何好的结果。 我最大的问题是,结果可能来自valueInt或valueString,这取决于它是数字还是文本

谢谢


Kuno

您可以创建一个字典,然后将其转换为json,如下所示:

您可以使用对象而不是int type作为值。或者对数字类型使用字符串,但在将来的操作中进行反序列化时,必须使用自定义转换类型

这也可能有帮助:


您可以创建一个字典,然后将其转换为json,如下所示:

您可以使用对象而不是int type作为值。或者对数字类型使用字符串,但在将来的操作中进行反序列化时,必须使用自定义转换类型

这也可能有帮助:

首先,您忽略了“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));
var properties=JsonConvert.DeserializeObject(str);
var result=JsonConvert.SerializeObject(properties.ToDictionary(
x=>x.propname,
x=>x.dataType==“N”?(对象)float.Parse(x.value):x.value));
首先,您忽略了“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));
var properties=JsonConvert.DeserializeObject(str);
var result=JsonConvert.SerializeObject(properties.ToDictionary(
x=>x.propname,
x=>x.dataType==“N”?(对象)float.Parse(x.value):x.value));
您实际的问题是如何将一个对象转换为另一个对象,而不是如何序列化JSON。一个快速而肮脏的修复方法是创建一个名称/值字典,并将其序列化。另一方面,
JObject
本质上是一个字典,因此您可以直接向它添加属性。您实际的问题是如何将一个对象转换为另一个对象,而不是如何序列化JSON。一个快速而肮脏的修复方法是创建一个名称/值字典,并将其序列化。另一方面,
JObject
本质上是一个字典,因此您可以直接向它添加属性