2017-01-11 3 views
0
var test = {'abc':76,'data':'[6435,3310,56.06875]'} 

как преобразовать выше JSON строки в объект сказать: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."} 
+0

На каком языке/среде? –

+0

http://stackoverflow.com/questions/6620165/how-can-i-parse-json-with-c – cuniculus

+0

Возможный дубликат [Как я могу разобрать JSON с C#?] (Http://stackoverflow.com/questions/6620165/how-can-i-parse-json-with-c) –

ответ

0

Есть несколько проблем с json-строкой (я предполагаю, что вы используете C#). Первое из значений свойства data на самом деле является строкой (с учетом котировок). Вот почему вы получаете ошибку.

Что вы можете сделать, это создать свойство для хранения строки, а затем другое свойство для анализа значений float после анализа. Это делается с использованием нескольких атрибутов JSON.Net от JsonProperty и JsonIgnore. Эти атрибуты указывают сериализатору, что имя свойства находится в строке 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); 
0

Это может сделать трюк для вас

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

Я использовал замену, потому что '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; } 
} 
Смежные вопросы