2016-10-07 2 views
1

Пожалуйста, я очень новичок в json. У меня есть url, который передаёт значения, а возвращаемые данные находятся в json. Мне нужно десериализовать json из этого URL-адреса, а затем привязать его к элементу управления списком в asp.net. Вот как выглядят данные json.конвертировать json массив в datatable asp.net

{"records":[{"record":{"Ch_ID":"27","User_id":"1","Ch_Name":"test1","Ch_Description":"test1description","Ch_Starttime":""}},{"record":{"Ch_ID":"29","User_id":"1","Ch_Name":"w","Ch_Description":"ww","Ch_Starttime":"12"}},{"record":{"Ch_ID":"30","User_id":"1","Ch_Name":"qq","Ch_Description":"qqqdescription","Ch_Starttime":"1222"}},{"record":{"Ch_ID":"31","User_id":"1","Ch_Name":"v","Ch_Description":"vv","Ch_Starttime":"1"}},{"record":{"Ch_ID":"32","User_id":"1","Ch_Name":"n","Ch_Description":"nnnn","Ch_Starttime":"111"}}]} 

Есть ли у кого-нибудь идеи, как я могу это сделать. Я пробовал json.net, но он дает мне ошибки.

+0

Это ошибка, которую я получаю. Невозможно десериализовать текущий объект JSON (например, {"name": "value"}) в type 'wireframes.wcodes []', потому что для этого типа требуется массив JSON (например, [1,2 , 3]) для десериализации. –

+2

Добро пожаловать в Stackoverflow. Пожалуйста, вы можете обновить свой вопрос с помощью C#, который вы используете для выполнения десериализации. –

+2

Пожалуйста, включите код, который вы пробовали, что дало вам ошибку. –

ответ

0

Json.NET делает поддержку десериализации DataTable через встроенный в DataTableConverter, однако он ожидает, что JSON должен быть отформатирован в виде массива, следующим образом:

[ 
    { 
    "Ch_ID": "27", 
    "User_id": "1", 
    // Other fields 
    }, 
    { 
    "Ch_ID": "29", 
    "User_id": "1", 
    // Other fields 
    }, 
    // Other records 
] 

Ваш JSON вместо этого отформатирован следующим образом:

{ 
    "records": [ 
    { 
     "record": { 
     "Ch_ID": "27", 
     "User_id": "1", 
     // Other fields 
     } 
    }, 
    { 
     "record": { 
     "Ch_ID": "29", 
     "User_id": "1", 
     // Other fields 
     } 
    }, 
    // Other records 
    ] 
} 

Вы можете перевести фактическое JSON в формат, требуемый Json.NET с помощью custom JsonConverter:

public class RecordDataTableConverter : Newtonsoft.Json.Converters.DataTableConverter 
{ 
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     if (reader.TokenType == JsonToken.Null) 
      return null; 
     if (reader.TokenType == JsonToken.StartObject) 
     { 
      var token = JToken.Load(reader); 
      token = new JArray(token.SelectTokens("records[*].record")); 
      using (var subReader = token.CreateReader()) 
      { 
       while (subReader.TokenType == JsonToken.None) 
        subReader.Read(); 
       return base.ReadJson(subReader, objectType, existingValue, serializer); // Use base class to convert 
      } 
     } 
     else 
     { 
      return base.ReadJson(reader, objectType, existingValue, serializer); 
     } 
    } 
} 

И использовать его следующим образом:

var json = GetJson(); 

var settings = new JsonSerializerSettings 
{ 
    Converters = new[] { new RecordDataTableConverter() }, 
}; 

var table = JsonConvert.DeserializeObject<DataTable>(json, settings); 

Sample fiddle.

+0

Большое спасибо, я просто попробовал это, и я получаю эту ошибку: Неожиданный токен JSON при чтении DataTable. Ожидаемый StartArray, получил StartObject. Path '', строка 1, позиция 1. –

+0

@StanleyEkpunobi - я тестировал его с помощью json, который вы предоставили, и он работает. См. [Скрипка] (https://dotnetfiddle.net/ZvwJFQ). Если это не ваш настоящий JSON, или вы не используете десериализацию с помощью конвертера, как показано в ответе, пожалуйста, предоставьте [mcve] воспроизведение проблемы. – dbc

+0

ОК, он отлично работает, теперь большое спасибо. он преобразует его в фактический формат json. так как я десериализую его в строку или любой тип данных, который я могу привязать к элементу управления. –

Смежные вопросы