2016-10-21 4 views
1

Позволять это JSON строка:Машинопись JSON строку в класс

[ 
    { 
     "id": 1, 
     "text": "Jon Doe" 
    }, 
    { 
     "id": 1, 
     "text": "Pablo Escobar" 
    } 
] 

Пусть будет этот класс:

export class MyObject{ 
    id: number; 
    text: string; 
} 

Как я могу бросить эту JSON строку в списке MyObject?

Если я:

console.log(<MyObject[]>JSON.parse(json_string)); 

возвращает список Object вместо списка MyObject

+2

Возможный дубликат [Как бросить объект JSON в машинописном класс] (HTTP: // StackOverflow.com/questions/22875636/how-do-i-cast-a-json-object-to-a-typecript-class) – xmojmr

ответ

4

Вам не обязательно нужен класс здесь. Вы можете просто использовать интерфейс

export interface MyObject{ 
    id: number; 
    text: string; 
} 

Тогда вы можете просто написать:

var myObjArray : MyObject[] = [ 
    { 
    "id": 1, 
    "text": "Jon Doe" 
    }, 
    { 
    "id": 1, 
    "text": "Pablo Escobar" 
    } 
]; 

Если вы данные поступают от сервера, вы, вероятно, в переменной типа любой, и вы можете просто назначьте его массиву этого типа, и он будет работать как ожидалось.

var data: any = getFromServer(); 
var myObjectArray:MyObject[] = data; 

В машинописи вам не нужен класс, реализующий интерфейс. Любой литерал объекта, который удовлетворяет интерфейсу, будет выполнен.

Если ваши данные по-прежнему находятся в строке, вы можете просто использовать JSON.parse(jsonString) для разбора строки на объекты JavaScript.

См площадка here

+0

Thanl вы для вашего ответа. Но возвращаемый объект по-прежнему не является типом «MyObject». Когда я регистрирую его в консоли, он говорит, что это «объект». Что я делаю не так? – Ben

+0

Не нужно указывать MyObject, это сработает. Типы дескрипторов больше описывают форму объекта Javascript. Если объект удовлетворяет контракту, это должно быть хорошо. Есть ли конкретная ошибка, которую вы получаете? Объект, который вы видите на консоли, имеет свойства id и text? Если так, то это должно сработать. –

+0

И поскольку MyObject теперь является интерфейсом, он не будет иметь никакого фактического присутствия в выходе JS, интерфейсы стираются с помощью компиляции TS, они просто там, чтобы вы могли описать форму объектов JS. –

4

Вам необходимо будет создать конструктор для класса, и вызвать его для каждого элемента в список вы получаете.

export class MyObject{ 
    constructor(public id: number, public text: string) { } 
} 

let data = [ 
    { 
    "id": 1, 
    "text": "Jon Doe" 
    }, 
    { 
    "id": 1, 
    "text": "Pablo Escobar" 
    } 
]; 

let objects = data.map(o => new MyObject(o.id, o.text)); 

Вы можете проверить его на детской площадке here.

+0

Я видел во многих сообщениях, что это возможно сделать без привязки каждого свойства, как это было предложено @ Титиан Черникова-Драгомир. Что правда? Есть ли способ сделать это без картографирования? – Ben

+2

@Ben Это зависит от того, что вы ищете. Если вы хотите только объект данных, вы можете пойти с интерфейсами, как ответил TitianCernicovaDragomir. Однако, если вы хотите также иметь методы для объектов, вам необходимо создать экземпляр экземпляров класса, а решение toskv - это тот, который вы ищете. –

+1

@Ben, если вам нужно добавить еще несколько методов, то вам нужно мое решение, если вам просто нужно использовать объекты, поскольку они поступают с сервера, решение интерфейса более подходящее. :) – toskv

1

Существует проблема, когда MyObject имеет 50 или более свойств ...

Добавьте конструктор в классе MyObject так, что он расширяет свой объект JSON.

export class MyObject { 
    constructor(json: any) 
    { 
     $.extend(this, json); 
    } 
    id : number; 
    text : string; 

    methodOnMyObject() {...} 
} 

В вашем АЯКС обратный вызов, создать объект MyObject из вашего JSon объекта:

let newObject = new MyObject(json); 
newObject.methodOnMyObject(); 

Я подробно решение в этой post.

+0

Если вы хотите использовать метод jquery $ .extend в вашем файле машинописных файлов, вам нужно включить jquery в ваши файлы машинописных файлов сначала запуск 'npm install --save @ types/jquery' [см. этот ответ] (https://stackoverflow.com/a/43914578/7794769). – stomy

+0

Если это не 'let newObject = new MyObject (JSON.parse (json)); вместо этого? – stomy

0

Еще один способ для достижения этой цели:

var data: any = getFromServer(); 
var myObjectArray = data as MyObject; 

Или:

var data: any = getFromServer(); 
var myObjectArray = <MyObject>dataMyObject;