json字符串与数组对象

时间:2017-01-11 04:06:26

标签: c# json json.net

var test = {'abc':76,'data':'[6435,3310,56.06875]'}

如何将上面的json字符串转换为对象说:

class item
{
    public string abc {Get;set;}
    public float[] data {get;set}
}

我试过了 JsonConvert.DeserializeObject<item>(test); 但得到这个错误:

{"Error converting value \"[6435,3310]\" to type 'System.Single[]'. Path 'data', line 1, position 117."}

2 个答案:

答案 0 :(得分:0)

json字符串存在一些问题(假设您使用的是C#)。 data属性的第一个值实际上是一个字符串(给定引号)。这就是你收到错误的原因。

您可以做的是创建一个属性来保存字符串,然后创建另一个属性来解析解析后的float值。这是通过使用JsonPropertyJsonIgnore的一些JSON.Net属性来完成的。这些属性告诉序列化程序json字符串中的属性名称以及要忽略的属性。

class Foo
{
    string dataString;
    float[] data = null;

    [JsonProperty("abc")]
    public string Abc { get; set; }

    [JsonProperty("data")]
    public string DataString
    {
        get { return dataString; }
        set
        {
            data = null;
            dataString = value;
        }
    }

    [JsonIgnore]
    public float[] Data
    {
        get
        {
            if (data != null)
                return data;

            return data = dataString != null ? JsonConvert.DeserializeObject<float[]>(DataString) : null;
        }
        set
        {
            DataString = value == null ? null : JsonConvert.SerializeObject(value);
        }
    }
}

这看起来很多代码但是使用支持字段允许您更改Data字段和DataString字段,同时维护一个正常工作的序列化程序。

然后使用

简单地调用它
var i = JsonConvert.DeserializeObject<Foo>(test);

答案 1 :(得分:0)

这可能会为你做到这一点

string jsn = @"{'abc':76,'data':'[6435,3310,56.06875]'}";
jsn = jsn.Replace("'[", "[");
jsn = jsn.Replace("]'", "]");
var ser = JsonConvert.DeserializeObject<ClsResult>(jsn);

我使用了replace,因为'data':'[6435,3310,56.06875]'正在将数据数组转换为字符串。所以我们更好地使它成为'data':[6435,3310,56.06875],然后你的类看起来像

public class ClsResult
{
    [JsonProperty("abc")]
    public int abc { get; set; }

    [JsonProperty("data")]
    public IList<double> data { get; set; }
}