Вопрос по json, javascript, jquery – Есть ли функция Jquery, которая может взять значение идентификатора #ref из проанализированной строки JSON и указать мне на указанный объект?

0

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

Моя строка JSON (возвращенная из веб-службы) содержит циклические ссылки (#ref), которые указывают на $ id в строке. Теперь я знаю, что если использовать jquery parseJSON, то он создает объект javascript, и я могу получить доступ к свойствам в виде myObject.MyPropertyName. Однако, когда я добираюсь до #ref, я не уверен, как получить объект, на который указывает идентификатор (который, я полагаю, уже создан в результате десериализации ...

Должен ли я перебирать объект и все его дочерние объекты, пока не найду его, или есть более простой способ?

$.ajax({
        type: "POST",
        url: "/Task.asmx/GetTask",
        data: "{'id':'" + '27' + "'}",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (msg) {
            _Data = $.parseJSON(msg.d ? msg.d : msg);
            _this.Company = _Data[0].t_Program.t_Company;
            _this.Program = _Data[0].t_Program;
            _this.Task = _Data[0];
        },
        complete: function () {

        }
    });

Рассматриваемая область - _Data [0] .t_Program, потому что она не возвращает объект, а скорее возвращает

_Data[0].t_Program
 {...}
   $ref: "12"

Я не знаю точно, как получить объект с помощью $ id & quot; 12 & quot ;. Судя по сообщениям ниже, мне кажется, что я должен перебрать существующий объект, но я надеялся, что есть функция jquery, которая сделала это ...

Большое спасибо!

Добро пожаловать в переполнение стека. Не забудьте высказать ВСЕ ответы, которые вы считаете полезными, в том числе и другим & apos; вопросы. И & quot; проверить & quot; / принять ответ на ваши вопросы, которые лучше всего отвечают на ваши вопросы. Larry K
Попробуйте опубликовать часть своего кода в качестве примера, чтобы мы могли полностью представить, что вы пытаетесь сделать. удачи! :) jmort253
пусть код говорит сам за себя! Joseph

Ваш Ответ

3   ответа
1

Нет, jQuery изначально не способен разрешать циклические ссылки в объектах, преобразованных из JSON.

Единственная библиотека для того, что я знаю, этоДоджо & APOS; sdojox.json.ref module.

Но ваше серверное приложение как-то сериализует этот JSON. Не говорите мне, что решение, которое оно использует, не предлагает алгоритм десериализации!

Error: User Rate Limit Exceededstackoverflow.com/questions/4992383/… ps_md
0

Как говорил мне мой друг Алан, автор библиотеки Xerox Courier (RPC через сеть), «на проводе нет указателей».

Другими словами, это невозможно дляJSON representation структуры данных, чтобы быть круговой. (Но круговая структура может быть сведена в некруглую структуру JSON.) КакJSON сайт говорит:

JSON is built on two structures:

A collection of name/value pairs. In various languages, this is realized as an object, record, struct, dictionary, hash table, keyed list, or associative array.

An ordered list of values. In most languages, this is realized as an array, vector, list, or sequence.

Нет указателей!

Таким образом, весь JSON будет превращен в объекты и / или массивы Javascript послеjQuery parseJSON операция завершена.

Если исходные значения ref_id структуры использовались в качестве имен свойств в объекте JSON / Javascript, то все они будут там.

The real issue вы должны понимать, как ваш сервер сериализует свою структуру данных в структуру данных JSON. Посмотрите на ваш серверный код, чтобы определить это.

Затем используйте Javascript для десериализации структуры JSON обратно в лучшую структуру Javascript, соответствующую вашим потребностям.

Re: Should i be iterating though the object and all its child objects until i find it, or is there an easier way?

Более простой способ - один раз пройтись по структуре Javascript и создать дополнительную «индексацию». объект, свойства которого являются #ref_id, а значения являются исходной структурой / значением.

0

Образец: var jsonCyclicReferenceFixed = JsonRecursive.parse (jsonWithRefAndId);

(function(){

function type(value){

    var t = typeof(value);

    if( t == "object" && value instanceof Array) {
        return "array";
    }

    if( t == "object" && value && "$id" in value && "$values" in value) {
        return "array";
    }

    return t;
}

function TypeConverterFactory(){

    var converters = {};

    var defaultConverter = {
        fromJson: function(value){ return value; },
        toJson: function(value){ return value; },
    };

    this.create = function(type){
        var converter = converters[type];
        if(!converter) return defaultConverter;
        return converter;
    };

    this.register = function(type, converter){
        converters[type] = converter;
        converter.valueConverter = this.valueConverter;
    };
}



function ObjectConverter(){

    this.fromJson = function(obj){

        if( obj == null ) return null;              

        if( "$ref" in obj ){
            var reference = this.dictionary[obj.$ref];
            return reference;
        }

        if("$id" in obj){
            this.dictionary[obj.$id] = obj;
            delete obj.$id;
        }

        for(var prop in obj){
            obj[prop] = this.valueConverter.convertFromJson(obj[prop]);
        }

        return obj;

    }

    this.toJson = function(obj){

        var id = 0;

        if(~(id = this.dictionary.indexOf(obj))){
            return { "$ref" : (id + 1).toString() };
        }

        var convertedObj = { "$id" : this.dictionary.push(obj).toString() };

        for(var prop in obj){
            convertedObj[prop] = this.valueConverter.convertToJson(obj[prop]);
        }

        return convertedObj;

    }

}   

function ArrayConverter(){

    var self = this;

    this.fromJson = function(arr){

        if( arr == null ) return null;              

        if("$id" in arr){

            var values = arr.$values.map(function(item){
                return self.valueConverter.convertFromJson(item);
            });

            this.dictionary[arr.$id] = values;

            delete arr.$id;

            return values;
        }

        return arr;

    }

    this.toJson = function(arr){

        var id = 0;

        if(~(id = this.dictionary.indexOf(arr))){
            return { "$ref" : (id + 1).toString() };
        }

        var convertedObj = { "$id" : this.dictionary.push(arr).toString() };

        convertedObj.$values = arr.map(function(arrItem){
            return self.valueConverter.convertToJson(arrItem);
        });

        return convertedObj;

    }

}   

function ValueConverter(){

    this.typeConverterFactory = new TypeConverterFactory();
    this.typeConverterFactory.valueConverter = this;
    this.typeConverterFactory.register("array", new ArrayConverter);
    this.typeConverterFactory.register("object", new ObjectConverter);

    this.dictionary = {};

    this.convertToJson = function(valor){

        var converter = this.typeConverterFactory.create(type(valor));
        converter.dictionary = this.dictionary;
        return converter.toJson(valor);         

    }

    this.convertFromJson = function(valor){

        var converter = this.typeConverterFactory.create(type(valor));
        converter.dictionary = this.dictionary;         
        return converter.fromJson(valor);

    }

}


function JsonRecursive(){

    this.valueConverter = new ValueConverter();

}

JsonRecursive.prototype.convert = function(obj){
    this.valueConverter.dictionary = [];
    var converted = this.valueConverter.convertToJson(obj);
    return converted;

}

JsonRecursive.prototype.parse = function(string){
    this.valueConverter.dictionary = {};
    var referenced = JSON.parse(string);
    return this.valueConverter.convertFromJson(referenced);

}


JsonRecursive.prototype.stringify = function(obj){

    var converted = this.convert(obj);
    var params = [].slice.call(arguments, 1);
    return JSON.stringify.apply(JSON, [converted].concat(params));

}

if(window){

    if( window.define ){
        //to AMD (require.js)
        window.define(function(){
            return new JsonRecursive();
        });

    }else{
        //basic exposition
        window.jsonRecursive = new JsonRecursive();
    }

    return;
}

if(global){
    // export to node.js
    module.exports = new JsonRecursive();   
}


}());

Образец:

// a object recursive
// var parent = {};
// var child = {};
// parent.child = child;
// child.parent = parent;
//
//results in this recursive json

var json = '{"$id":"0","name":"Parent","child":{"$id":"1","name":"Child","parent":{"$ref":"0"}}}'

//Parsing a Recursive Json to Object with references
var obj = jsonRecursive.parse(json);

// to see results try console.log( obj );

alert(obj.name);
alert(obj.child.name);
Error: User Rate Limit Exceededstackoverflow.com/questions/15312529/…
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы