javascript - JSON 解析 Javascript 丢失 id 字段时出错

标签 javascript json reactjs

当我使用 JSON.parse() 解析该字符串时。我得到了一些对象,其中一些包含 id = null。我没有找到任何 id = null 的对象。真的有什么问题吗?

                        console.log("TERRITORIES000: ");
                        console.log(territories);
                        territories = JSON.parse(territories);
                        console.log("TERRITORIES111: ");
                        console.log(territories);

我看到名为“B.C Paul (B.Baria, Akhaura)”的领土包含 id = null。但它的 id 在 json 字符串中不为空。我正在chrome浏览器中测试它。很奇怪。

[ {
  "name" : "MBKB, Sylhet (Metro, Biswanath, Kanaighat, Osmaninagar)",
  "area" : {
    "name" : "Sylhet",
    "region" : {
      "name" : "Sylhet",
      "id" : 3
    },
    "id" : 11
  },
  "id" : 36
}, {
  "name" : "MBKB (Sunamgonj)",
  "area" : {
    "name" : "Sylhet",
    "region" : {
      "name" : "Sylhet",
      "id" : 3
    },
    "id" : 11
  },
  "id" : 37
}, {
  "name" : "South Sylhet (Moulavi Bazar, Kulaura)",
  "area" : {
    "name" : "B.Baria",
    "region" : {
      "name" : "Sylhet",
      "id" : 3
    },
    "id" : 12
  },
  "id" : 38
}, {
  "name" : "B.C Paul (B.Baria, Akhaura)",
  "area" : {
    "name" : "B.Baria",
    "region" : {
      "name" : "Sylhet",
      "id" : 3
    },
    "id" : 12
  },
  "id" : 39
}, {
  "name" : "Sharif Store, (Habigonj)",
  "area" : {
    "name" : "B.Baria",
    "region" : {
      "name" : "Sylhet",
      "id" : 3
    },
    "id" : 12
  },
  "id" : 40
}, {
  "name" : "JR Corporation, (Bhairab)",
  "area" : {
    "name" : "Narshingdi",
    "region" : {
      "name" : "Sylhet",
      "id" : 3
    },
    "id" : 13
  },
  "id" : 41
}, {
  "name" : "JR Corporation, (Narsingdi)",
  "area" : {
    "name" : "Narshingdi",
    "region" : {
      "name" : "Sylhet",
      "id" : 3
    },
    "id" : 13
  },
  "id" : 42
}, {
  "name" : "Islam Traders, (Kishorgonj- 1, Kishorgonj- 2)",
  "area" : {
    "name" : "Narshingdi",
    "region" : {
      "name" : "Sylhet",
      "id" : 3
    },
    "id" : 13
  },
  "id" : 43
}, {
  "name" : "Noor  Son's (Mymensing, Fulpur, Bhaluka)",
  "area" : {
    "name" : "Mymensingh",
    "region" : {
      "name" : "Sylhet",
      "id" : 3
    },
    "id" : 14
  },
  "id" : 44
}, {
  "name" : "Amin & Co. (Sherpur, Jamalpur)",
  "area" : {
    "name" : "Mymensingh",
    "region" : {
      "name" : "Sylhet",
      "id" : 3
    },
    "id" : 14
  },
  "id" : 45
}, {
  "name" : "Shashi Mohan Roy (Netrokona)",
  "area" : {
    "name" : "Mymensingh",
    "region" : {
      "name" : "Sylhet",
      "id" : 3
    },
    "id" : 14
  },
  "id" : 46
} ]

这是完整的代码

(function () {
    var Form = React.createClass({

        getDefaultProps: function () {
            return {
            };
        },
        getInitialState: function () {
            return {
                region: this.emptyRegion(),
                regions: []
            }
        },
        componentDidMount: function (e) {
            var $this = this;
            $.ajax({
                url: '/search-regions',
                method: 'get',
                cache: false,
                success: function (regions) {
                    regions = JSON.parse(regions);
                    $this.setState({regions: regions});

                    var region = regions.filter(function (region) {return region.id == $this.state.region.id})[0] || $this.emptyRegion();
                    region = JSON.parse(JSON.stringify(region));
                    region.areas = [];
                    region.area = $this.emptyArea();
                    $this.findRegion(region);

                }.bind($this),
                error: function (x) {
                    try {
                        alert(JSON.parse(x.responseText).message);
                    } catch (e) {
                        alert("Server Error: Please try again.");
                    }
                }.bind($this),
            });
        },
        onRegionChange: function (e) {
            var region = JSON.parse(JSON.stringify(this.state.region));
            region.id = e.target.value;
            this.findRegion(region);
        },
        onAreaChange: function (e) {
            var region = JSON.parse(JSON.stringify(this.state.region));
            region.area.id = e.target.value
            this.findRegion(region);
        },
        onTerritoryChange: function (e) {
            var region = JSON.parse(JSON.stringify(this.state.region));
            region.area.territory.id = e.target.value;
            this.findRegion(region);
        },
        render: function () {
            console.log("RENDERING: ");
            console.log(this.state.region);
            var modalCounter = 1;

            var region_ops = this.state.regions.map(function (region) {
                                 return (<option value={region.id} key={region.id}>{region.name}</option>);
                             });

            var area_ops = this.state.region.areas.map(function (area) {
                                 return (<option value={area.id} key={area.id}>{area.name}</option>);
                             });

            var territory_ops = this.state.region.area.territories.map(function (territory) {
                                 return (<option value={territory.id} key={territory.id}>{territory.name}</option>);
                             });

            return (
                <form>

                    <div className="row">
                        <div className="col-md-2">

                            <div className="form-group">

                                <select className="form-control"
                                value={this.state.region.id}
                                onChange={this.onRegionChange}
                                name="region">
                                    <option value="">Select Region</option>
                                    {region_ops}
                                </select>

                            </div>

                        </div>

                        <div className="col-md-2">

                            <div className="form-group">

                                <select className="form-control"
                                value={this.state.region.area.id}
                                onChange={this.onAreaChange}
                                name="area">
                                    <option value="">Select Area</option>
                                    {area_ops}
                                </select>

                            </div>

                        </div>

                        <div className="col-md-2">

                            <div className="form-group">

                                <select className="form-control"
                                value={this.state.region.area.territory.id}
                                onChange={this.onTerritoryChange}
                                name="territory">
                                    <option value="">Select Territory</option>
                                    {territory_ops}
                                </select>

                            </div>

                        </div>

                        <div className="col-md-3">

                        </div>

                        <div className="col-md-2">

                        </div>

                    </div>

                    <div className="row">

                        <div className="col-md-4">

                            <DateRange modalId={"filter-modal-" + modalCounter++}
                                       name="Date Range"
                                       value="~date_range~"
                                       modalTitle="Please Select Date Range"/>

                        </div>

                        <div id="" className="col-md-8">

                            <button id="" type="submit" className="btn btn-primary pull-right btn-form-footer"
                                    name="__action__" value="search">Search
                            </button>

                            <button id="" type="submit" className="btn btn-danger pull-right btn-form-footer"
                                    name="__action__" value="clear">Clear
                            </button>

                        </div>

                    </div>

                </form>
            );
        },

        findRegion: function (region) {
            var state = {region: JSON.parse(JSON.stringify(region))};
            console.log(region);
            var $this = this;
            if (!!region.id) {

                $.ajax({
                    url: '/search-territories?id=' + region.id,
                    method: "get",
                    success: function (territories) {
                            console.log("TERRITORIES000: ");
                            console.log(territories);
                            territories = JSON.parse(territories);
                            console.log("TERRITORIES111: ");
                            console.log(territories);

                        region.areas = territories.filter(function(t) {
                            return t.area.region.id == state.region.id;
                        }).map(function (t) {
                            return t.area;
                        });
                        var areas = {};
                        for(var x in region.areas) {
                            areas[region.areas[x].id] = region.areas[x];
                        }
                        var array = [];
                        for(var x in areas) {
                            array.push(areas[x]);
                        }
                        region.areas = array;

                        region.area = region.areas.filter(function(a) {return a.id == state.region.area.id})[0] || $this.emptyArea();
                        region.area = JSON.parse(JSON.stringify(region.area));
                        region.area.territories = [];
                        region.area.territory = $this.emptyTerritory();
                        if (!!region.area.id) {

                            console.log("TERRITORIES222: ");
                            console.log(territories);

                            region.area.territories = [];

                            for(var x in territories) {
                                if (territories[x].area.id == state.region.area.id) {
                                    region.area.territories.push(territories[x]);
                                }
                            }

                            console.log("ORIGINAL: ");
                            console.log(region.area.territories);

                            var trrs = {};
                            for(var x in region.area.territories) {
                                trrs[region.area.territories[x].id] = region.area.territories[x];
                            }
                            console.log("TERRR:");
                            console.log(trrs);
                            var array = []

                            for(var x in trrs) {
                                array.push(trrs[x]);
                            }
                            console.log("ARRAY:");
                            console.log(array)
                            region.area.territories = array;

                            region.area.territory = region.area.territories.filter(function (t) {return t.id = state.region.area.territory.id})[0] || $this.emptyTerritory();
                            region.area.territory = JSON.parse(JSON.stringify(region.area.territory));
                        }
                        console.log("SET STATE: ");
                        console.log(region);
                        $this.setState({region: region});
                    }.bind($this),
                    error: function (x) {
                        try {
                            alert(JSON.parse(x.responseText).message);
                        } catch (e) {
                            alert("Server Error: Please try again.");
                        }
                    }.bind($this),
                });

            }
        },

        emptyTerritory: function () {
                    return {
                        id: null,
                        name: "",
                    }
                },
        emptyArea: function () {
            return {
                id: null,
                name: "",
                territory: this.emptyTerritory(),
                territories: []
            }
        },
        emptyRegion: function () {
            return {
                id: null,
                name: "",
                area: this.emptyArea(),
                areas:[]
            }
        }
    });

    ReactDOM.render(<Form/>, document.getElementById("filters-div"));
})();

最佳答案

JSON 库不允许空对象,如果您在后端逻辑中放置空对象,该库不会将其添加到 JSON 结构中。

当然,如果您要生成 JSON,则所有这些都是如此。

Java - 即:

JSONObject o = new JSONObject();
o.put("key",null);

如果调用 o.toString(),结果将是:

"{}"

您需要放置一个 NULL 对象:

JSONObject o = new JSONObject();
o.put("key",JSONObject.NULL);

如果调用 o.toString(),结果将是:

"{\"key\":null}"

如果你没有生成 JSON,我可以说 JSON 没有任何问题,当你获取对象的 id 时,结果将是 ID本身或未定义(null),具体取决于 id 是否存在于 JSON 结构中。

希望这有帮助!

关于javascript - JSON 解析 Javascript 丢失 id 字段时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33649252/

相关文章:

javascript - 使用 API 将 HP QC 中的数据提取到 Excel

javascript - 在选择更改时打开下一个选择元素

json - 获取 JSON 返回错误 Uncaught (in promise) SyntaxError : Unexpected token < in JSON at position 0 and status code 304: Not Modified

java - Jersey Jackson 序列化父字段

javascript - if 和 else 条件均被执行

javascript - 如何使用 redux 对项目进行排序

javascript - 我如何为 ag-grid 设置默认过滤器值

javascript - Mongoose "schema method"回调不工作

java - com.fasterxml.jackson.databind.exc.MismatchedInputException : Cannot construct instance of `java.util.LinkedHashMap`

reactjs - <React.Fragment> 或 <></> 上出现流错误,但 <Fragment> 上没有流错误