spring 反序列化包含JsonIdentityInfo的JavaScript中的Jackson对象

xxe27gdn  于 2023-01-29  发布在  Spring
关注(0)|答案(3)|浏览(204)

你好(对不起我英语)
我在angularjs的前端网站消费的web服务生产json与Spring的MVC.Spring的MVC使用jsonIdentityInfo选项串行化,所以每个对象只写一次在json和其他时间的引用被使用,例如她有2个"计算机"使用相同的对象"组件",所以Spring把一个id到第一个组件("@componentID ":2),而对于第二个组件,仅使用id(2):

[
  {
    "@computerID": 1,
    "component": {
      "@componentID": 2,
      "processor": 2,
      "ram": "8g",
      "harddrive": "wd"
    }
  },
  {
    "@computerID": 3,
    "component": 2
  }
]

我想要的:

[
  {
    "@computerID": 1,
    "owner" : "Mister B",
    "component": {
      "@componentID": 2,
      "processor": 2,
      "ram": "8g",
      "harddrive": "wd"
    }
  },
  {
    "@computerID": 3,
    "owner" : "Mister A",
    "component": {
      "@componentID": 2,
      "processor": 2,
      "ram": "8g",
      "harddrive": "wd"
    }
  }
]

我做了许多搜索代码谁这样做,但我没有找到任何想法。
我无法编辑Web服务来移除这个行为。我可以用javascript或jquery(或其他库)编辑客户端的json来用真正的引用对象替换引用吗?(事实上数据更复杂和更深,我在对象中有3个级别的子对象)。
非常感谢。

yqlxgs2m

yqlxgs2m1#

我最近遇到了OP在这里描述的一个确切的场景。下面是我的解决方案。使用JSOG(Javascript对象图)格式来解决这个问题。
服务器端使用jackson-jsog插件https://github.com/jsog/jsog-jackson并使用以下注解注解每个类。
@JsonIdentityInfo(generator=JSOGGenerator.class)
而不是
@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "@id")
这将以JSOG格式生成。(@id@ref
在客户端,使用jsog.js
使用以下调用将JSOG结构转换为循环结构
cyclicGraph = JSOG.decode(jsogStructure);

0lvr5msh

0lvr5msh2#

将所有数组成员拆分为新数组:那些具有完整component属性(而不仅仅是一个数字)的成员和那些没有完整component属性的成员。循环遍历剩下的应该只有数字component属性的原始成员,然后从“good”数组中查找对应的@componentID,并进行一些复制和移动。

// initialize some vars
var final = [], temp = [], bad = [],
    c = {},
    computers = [
      {
        "@computerID": 1,
        "component": {
          "@componentID": 2,
          "processor": 2,
          "ram": "8g",
          "harddrive": "wd"
        }
      },
      {
        "@computerID": 3,
        "component": 2
      }
    ];

// split original array into 3: final, bad, & temp
while(computers.length > 0) {
    c = computers.pop();
    if (c.hasOwnProperty("component")) {
        if (typeof c.component === "number") {
            temp.push(c);
        } else {
            final.push(c);
        }
    } else {
        bad.push(c);
    }
}

// loop through temp & look up @componentID within final
while (temp.length > 0) {
    c = temp.pop();
    // should @componentID be 1-of-a-kind?
    var found = getObjects(final, "@componentID", c.component);
    if (found.length) {
        c.component = found[0];
        final.push(c);
    } else {
        bad.push(c);
    }
}

// SOURCE: http://stackoverflow.com/a/4992429/1072176
function getObjects(obj, key, val) {
    var objects = [];
    for (var i in obj) {
        if (!obj.hasOwnProperty(i)) continue;
        if (typeof obj[i] == 'object') {
            objects = objects.concat(getObjects(obj[i], key, val));
        } else if (i == key && obj[key] == val) {
            objects.push(obj);
        }
    }
    return objects;
}

// should result in just one or two populated arrays: final and/or bad
alert(JSON.stringify(final));

您会注意到我实际上创建了三个数组,但最终只有两个被填充:final包含您的好的新对象,而另一个(bad)是没有component属性的对象,或者其组件号无法找到对应的@componentID的对象的所有对象。

57hvy0tb

57hvy0tb3#

发现了同样的问题,挣扎了几个小时。尝试了 @JsonManagedRefernceJSOGGenerator 等。
没有一个工作或结束了混乱。
我在另一个类似的问题上找到了THIS的答案。对我来说,它工作得很完美。只是添加了类并编辑了实体。
希望这对某人有帮助!

相关问题