【问题标题】:JSON custumize toStringJSON 自定义 toString
【发布时间】:2017-11-19 07:32:56
【问题描述】:

您只需阅读下面粗体字的问题即可回答整个问题,我想提供一些背景信息,以防问题不清楚

我正在重新创建一个区块链,因此需要验证创建的区块是否满足给定的要求(散列整个区块(矿工放入他的 nonce 解决方案的地方)必须小于给定的目标)。

所以我目前正在做的和正在做的事情是:

private static boolean checkDifficulty(JSONObject message) {
try {
        String blockString = message.get("block").toString();
        JSONObject blockPayLoad = (JSONObject) JSONValue.parse(blockString);
        BlockPayload block = new BlockPayload(blockPayLoad);
        BigInteger base = new BigInteger("2",16);
        String difficulty = Integer.toHexString(20+block.getDifficulty());
        BigInteger exponent = new BigInteger(difficulty,16);
        BigInteger totalSpace = base.pow(512);
        BigInteger target = totalSpace.divide(base.pow(exponent.intValueExact()));
        BigInteger hashedBlock3 = new BigInteger(1,hashSHA512(blockString));
return(hashedBlock3.compareTo(target) == -1);

    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }

    return false;

我最初认为我可以做的是,我使用我的数据结构 BlockPayload。相关部分如下所示:

public BlockPayload(JSONObject blockPayLoad) {
    this.stringRepresentation = blockPayLoad.toString();
    this.type = blockPayLoad.get("type").toString();        
    this.transactions = blockPayLoad.get("transactions").toString();        
    this.timestamp = blockPayLoad.get("timestamp").toString();
    this.reward = blockPayLoad.get("reward").toString();
    this.difficulty = Integer.parseInt(blockPayLoad.get("difficulty").toString());
    this.nonce = blockPayLoad.get("nonce").toString();
    this.parent = blockPayLoad.get("parent").toString();
}

我的 toString() 返回字符串表示。 可悲的是,尝试上述相同的事情(散列字符串表示)会产生不同的结果。

我认为这是 b/c 我的 toString 没有相同的顺序,这意味着 JSONObject 中的属性顺序发生了变化。

所以这是我的问题:我能否以某种方式自定义 toString(),以保证属性按所需顺序显示?

【问题讨论】:

    标签: java json tostring json-simple


    【解决方案1】:

    是的,您可以将它们放在树形图中,然后您可以散列它们,树形图是一个完全有序的映射,无需执行任何操作,它通过键从低到高对元素进行排序,看看https://beginnersbook.com/2013/12/treemap-in-java-with-example/

    TreeMap<String, String> tmap = 
             new TreeMap<String, String>();
     tmap.put("1", "Data1");
      tmap.put("23", "Data2");
      tmap.put("70", "Data3");
      tmap.put("4", "Data4");
      tmap.put("2", "Data5");
    // this will be like this after converting it to Json using Gson lib
    // new Gson ().toJson(tmap);
    {"1":"Data1","2":"Data5","23":"data2","4":"data4","70":"Data3"}
    

    【讨论】:

    • 它必须保持在 Json 格式内
    • 所以你想订购json?
    • 有一个名为 Gson 的库,它将树图转换为 json 结构,然后您可以对其进行哈希处理
    • 其实我根本不想格式化它,但由于某种原因,我通过保存对该对象的 json.toString() 调用得到的字符串表示与我直接调用时不同toString() 对我来说毫无意义,但我想让它看起来和原来的一样
    • 如果您需要收到的 json 顺序,那么哈希值总是不同的,您应该按字母顺序排序以获得正确的哈希值,否则您必须制作太多代码,因为如果一个属性错过了它的订单,那么你会得到错误的哈希
    猜你喜欢
    • 2017-04-15
    • 1970-01-01
    • 2017-02-10
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多