In [1]:
class Doc:
    print("hello", end=' ')

def test_doc(h: Doc=None) -> None:
    '''world'''
    print(test_doc.__doc__)
    
test_doc()
hello world
In [43]:
NotImplemented, __debug__, Ellipsis, ...
Out[43]:
(NotImplemented, True, Ellipsis, Ellipsis)
In [44]:
lists = [[]] * 3
print(lists)

lists[0].append(3)
print(lists, lists[0] is lists[1])

lists[0][0] = 5
print(lists, lists[0] is lists[1])
[[], [], []]
[[3], [3], [3]] True
[[5], [5], [5]] True
In [45]:
a_tuple = (['foo'], 'bar')
a_tuple[0].append('item')
In [46]:
import re
re.match(r"(?P<name>\w+) .*(\w(?P=name))", "lds daslds").groups()
Out[46]:
('lds', 'slds')
In [49]:
lists = [[] for i in range(3)] 
print(lists)

lists[0].append(3)
lists, lists[0] is lists[1]
[[], [], []]
Out[49]:
([[3], [], []], False)
In [50]:
n = -65
bin(n), n.bit_length(), int.from_bytes(b"\x00\x34", "big", signed=False)
Out[50]:
('-0b1000001', 7, 52)
package com.lds.learn;

/**
 * TODO
 *
 * @author Liang Desheng
 * @version 1.0
 * @date 2022/11/5 14:06
 **/
public class ClassLearn {
    @Deprecated
    private int num = 1;

    public int add() {
        int incr = 1;
        return num + incr;
    }
}
In [5]:
# 字节码文件
cf = b'\xca\xfe\xba\xbe\x00\x00\x004\x00\x1a\n\x00\x04\x00\x16\t\x00\x03\x00\x17\x07\x00\x18\x07\x00\x19\x01\x00\x03num\x01\x00\x01I\x01\x00\nDeprecated\x01\x00\x19RuntimeVisibleAnnotations\x01\x00\x16Ljava/lang/Deprecated;\x01\x00\x06<init>\x01\x00\x03()V\x01\x00\x04Code\x01\x00\x0fLineNumberTable\x01\x00\x12LocalVariableTable\x01\x00\x04this\x01\x00\x1aLcom/lds/learn/ClassLearn;\x01\x00\x03add\x01\x00\x03()I\x01\x00\x04incr\x01\x00\nSourceFile\x01\x00\x0fClassLearn.java\x0c\x00\n\x00\x0b\x0c\x00\x05\x00\x06\x01\x00\x18com/lds/learn/ClassLearn\x01\x00\x10java/lang/Object\x00!\x00\x03\x00\x04\x00\x00\x00\x01\x00\x02\x00\x05\x00\x06\x00\x02\x00\x07\x00\x00\x00\x00\x00\x08\x00\x00\x00\x06\x00\x01\x00\t\x00\x00\x00\x02\x00\x01\x00\n\x00\x0b\x00\x01\x00\x0c\x00\x00\x008\x00\x02\x00\x01\x00\x00\x00\n*\xb7\x00\x01*\x04\xb5\x00\x02\xb1\x00\x00\x00\x02\x00\r\x00\x00\x00\n\x00\x02\x00\x00\x00\n\x00\x04\x00\x0b\x00\x0e\x00\x00\x00\x0c\x00\x01\x00\x00\x00\n\x00\x0f\x00\x10\x00\x00\x00\x01\x00\x11\x00\x12\x00\x01\x00\x0c\x00\x00\x00A\x00\x02\x00\x02\x00\x00\x00\t\x04<*\xb4\x00\x02\x1b`\xac\x00\x00\x00\x02\x00\r\x00\x00\x00\n\x00\x02\x00\x00\x00\x0f\x00\x02\x00\x10\x00\x0e\x00\x00\x00\x16\x00\x02\x00\x00\x00\t\x00\x0f\x00\x10\x00\x00\x00\x02\x00\x07\x00\x13\x00\x06\x00\x01\x00\x01\x00\x14\x00\x00\x00\x02\x00\x15'
In [6]:
from typing import Any, Union
import struct
from enum import Enum


class RTEnum(Enum):
    int_ = 'int'
    str_ = 'str'
    bytes_ = 'bytes'


class Resolver(dict):

    def __getattr__(self, __name: str) -> Any:
        return self[__name]

    def __setattr__(self, __name: str, __value: Any) -> None:
        self[__name] = __value

    def __init__(self, cf: Union[bytes, bytearray, str]) -> None:
        if isinstance(cf, str):
            with open(cf, "rb") as frd:
                cf = frd.read()
        self.cf = cf
        self.offset = 0
        self.max_len = len(cf)

    def next(self, n: Union[int, str], rtype: RTEnum) -> bytes:
        if not isinstance(n, (int, str)):
            raise ValueError(f"invalid type: {type(n)}")

        n = n if isinstance(n, int) else int(n.replace("u", ''))
        if self.offset + n <= self.max_len:
            res = self.cf[self.offset: self.offset + n]
            self.offset += n
            if rtype == RTEnum.str_:
                return self.offset-n, str(res).replace("b'", "").replace(r"\x", "").replace("'", "")
            elif rtype == RTEnum.int_:
                integer = None
                if n == 2:
                    integer = int(struct.unpack('>h', res)[0])
                elif n == 4:
                    integer = int(struct.unpack('>i', res)[0])
                elif n == 1:
                    integer = int(struct.unpack('>B', res)[0])

                assert integer is not None, "不能转为integer 或者 未接入"
                return self.offset-n, integer
            elif rtype == RTEnum.bytes_:
                return self.offset-n, res

            raise RuntimeError(f"未知的类型:{rtype}")
        raise ValueError(f"当前offset: {self.offset}, max_len: {self.max_len},剩下的数据不足{n}!")

    def back(self, n: int):
        assert n > 0
        self.offset = max(0, self.offset - n)

    def reset(self):
        self.offset = 0
        print("reset offset!")

    def seek(self, n: int):
        if 0 < n < self.max_len:
            self.offset = n
            print(f"set offset to {n}!")
        else:
            raise ValueError(f"{n} not int range({0}, {self.max_len})")

    def __repr__(self) -> str:
        return super().__repr__()

    __str__ = __repr__


# resolver = Resolver("ClassLearn.class")
resolver = Resolver(cf)

2. 解析, classFormat¶

ClassFile {
    u4             magic;
    u2             minor_version;
    u2             major_version;
    u2             constant_pool_count;
    cp_info        constant_pool[constant_pool_count-1];
    u2             access_flags;
    u2             this_class;
    u2             super_class;
    u2             interfaces_count;
    u2             interfaces[interfaces_count];
    u2             fields_count;
    field_info     fields[fields_count];
    u2             methods_count;
    method_info    methods[methods_count];
    u2             attributes_count;
    attribute_info attributes[attributes_count];
}

2.1 magic¶

In [53]:
resolver.reset()
resolver.magic_number = resolver.magic = resolver.next('u4',  RTEnum.str_)
print(resolver.magic)
reset offset!
(0, 'cafebabe')

2.2 minor_version¶

In [54]:
resolver.minor_version = resolver.next('u2',  RTEnum.int_)
print(resolver.minor_version)
(4, 0)

2.2 major_version (notes: java8 = 52)¶

  • java9 = 53
  • java11 = 54

其他以此类推

In [55]:
resolver.major_version = resolver.next('u2',  RTEnum.int_)
print(resolver.major_version)
(6, 52)

2.3 constant_pool_count¶

In [56]:
resolver.constant_pool_count = resolver.next('u2',  RTEnum.int_)
print(resolver.constant_pool_count)
(8, 26)
In [57]:
resolver.constant_pool = [None]

2.4 constant_pool[constant_pool_count-1];¶

常量池是一个结构表,,表示 ClassFile 以及其子结构 所引用的字符串常量, 类或接口名, 字段名以及其他常量。

每一个常量池表条目的格式由第一个 'tag' 字节指示。

常量池表的索引范围是 [1, constant_pool_count - 1]

所有条目都有以下常规格式:

cp_info {
    u1 tag;
    u1 info[];
}
Constant Type TagValue
CONSTANT_Class 7
CONSTANT_Fieldref 9
CONSTANT_Methodref 10
CONSTANT_InterfaceMethodref 11
CONSTANT_String 8
CONSTANT_Integer 3
CONSTANT_Float 4
CONSTANT_Long 5
CONSTANT_Double 6
CONSTANT_NameAndType 12
CONSTANT_Utf8 1
CONSTANT_MethodHandle 15
CONSTANT_MethodType 16
CONSTANT_InvokeDynamic 18
In [58]:
def check_tag(tag, require_tag):
    assert tag == require_tag, f"tag is {tag}, but require tag == {require_tag}"

def get_tag(resolver: Resolver) -> int:
    resolver.back(1)
    return resolver.next(1, RTEnum.int_)[-1]

def do_CONSTANT_Class_info(resolver: Resolver) -> None:
    tag = get_tag(resolver)
    check_tag(tag, 7)
    
    resolver.constant_pool.append({
        "tag": "CONSTANT_Class_info",
        "name_index": resolver.next(2, RTEnum.int_),
    })

# region
def do_CONSTANT_Fieldref_info(resolver: Resolver) -> None:
    tag = get_tag(resolver)
    check_tag(tag, 9)
    
    resolver.constant_pool.append({
        "tag": "CONSTANT_Fieldref_info",
        "class_index": resolver.next(2, RTEnum.int_),
        "name_and_type_index": resolver.next(2, RTEnum.int_),
    })
    
def do_CONSTANT_Methodref_info(resolver: Resolver) -> None:
    tag = get_tag(resolver)
    check_tag(tag, 10)
    
    resolver.constant_pool.append({
        "tag": "CONSTANT_Methodref_info",
        "class_index": resolver.next(2, RTEnum.int_),
        "name_and_type_index": resolver.next(2, RTEnum.int_),
    })
    
def do_CONSTANT_InterfaceMethodref_info(resolver: Resolver) -> None:
    tag = get_tag(resolver)
    check_tag(tag, 11)
    
    resolver.constant_pool.append({
        "tag": "CONSTANT_InterfaceMethodref_info",
        "class_index": resolver.next(2, RTEnum.int_),
        "name_and_type_index": resolver.next(2, RTEnum.int_),
    })
# endregion

def do_CONSTANT_String_info(resolver: Resolver) -> None:
    tag = get_tag(resolver)
    check_tag(tag, 8)
    
    resolver.constant_pool.append({
        "tag": "CONSTANT_String_info",
        "string_index": resolver.next(2, RTEnum.int_),
    })

# region 
def do_CONSTANT_Integer_info(resolver: Resolver) -> None:
    tag = get_tag(resolver)
    check_tag(tag, 3)
    
    resolver.constant_pool.append({
        "tag": "CONSTANT_Integer_info",
        "bytes": resolver.next(4, RTEnum.bytes_),
    })


def do_CONSTANT_Float_info(resolver: Resolver) -> None:
    tag = get_tag(resolver)
    check_tag(tag, 4)
    
    resolver.constant_pool.append({
        "tag": "CONSTANT_Float_info",
        "bytes": resolver.next(4, RTEnum.bytes_),
    })
# endregion


# region 
def do_CONSTANT_Long_info(resolver: Resolver) -> None:
    tag = get_tag(resolver)
    check_tag(tag, 5)
    
    resolver.constant_pool.append({
        "tag": "CONSTANT_Long_info",
        "high_bytes": resolver.next(4, RTEnum.bytes_),
        "low_bytes": resolver.next(4, RTEnum.bytes_),
    })


def do_CONSTANT_Double_info(resolver: Resolver) -> None:
    tag = get_tag(resolver)
    check_tag(tag, 6)
    
    resolver.constant_pool.append({
        "tag": "CONSTANT_Double_info",
        "high_bytes": resolver.next(4, RTEnum.bytes_),
        "low_bytes": resolver.next(4, RTEnum.bytes_),
    })
# endregion


def do_CONSTANT_NameAndType_info(resolver: Resolver) -> None:
    tag = get_tag(resolver)
    check_tag(tag, 12)
    
    resolver.constant_pool.append({
        "tag": "CONSTANT_NameAndType_info",
        "name_index": resolver.next(2, RTEnum.int_),
        "descriptor_index": resolver.next(2, RTEnum.int_),
    })


def do_CONSTANT_Utf8_info(resolver: Resolver) -> None:
    tag = get_tag(resolver)
    check_tag(tag, 1)
    
    length = resolver.next(2, RTEnum.int_)
    resolver.constant_pool.append({
        "tag": "CONSTANT_Utf8_info",
        "length": length,
        "bytes[length]": resolver.next(length[-1], RTEnum.bytes_),
    })


def do_CONSTANT_MethodHandle_info(resolver: Resolver) -> None:
    tag = get_tag(resolver)
    check_tag(tag, 15)
    
    resolver.constant_pool.append({
        "tag": "CONSTANT_MethodHandle_info",
        "reference_kind": resolver.next(1, RTEnum.int_),
        "reference_index": resolver.next(2, RTEnum.int_),
    }) 


def do_CONSTANT_MethodType_info(resolver: Resolver) -> None:
    tag = get_tag(resolver)
    check_tag(tag, 16)
    
    resolver.constant_pool.append({
        "tag": "CONSTANT_MethodType_info",
        "descriptor_index": resolver.next(2, RTEnum.int_),
    }) 


def do_CONSTANT_InvokeDynamic_info(resolver: Resolver) -> None:
    tag = get_tag(resolver)
    check_tag(tag, 18)
    
    resolver.constant_pool.append({
        "tag": "CONSTANT_InvokeDynamic_info",
        "bootstrap_method_attr_index": resolver.next(2, RTEnum.int_),
        "name_and_type_index": resolver.next(2, RTEnum.int_),
    }) 
In [59]:
CONSTANT_POOL_TAGS_TO_HANDLER = {
    7: do_CONSTANT_Class_info,
    9: do_CONSTANT_Fieldref_info,
    10: do_CONSTANT_Methodref_info,
    11: do_CONSTANT_InterfaceMethodref_info,
    8: do_CONSTANT_String_info,
    3: do_CONSTANT_Integer_info,
    4: do_CONSTANT_Float_info,
    5: do_CONSTANT_Long_info,
    6: do_CONSTANT_Double_info,
    12: do_CONSTANT_NameAndType_info,
    1: do_CONSTANT_Utf8_info,
    15: do_CONSTANT_MethodHandle_info,
    16: do_CONSTANT_MethodType_info,
    18: do_CONSTANT_InvokeDynamic_info,
}
In [60]:
for ind in range(1, resolver.constant_pool_count[-1]):
    tag = resolver.next(1, RTEnum.int_)[-1]
    print(">> ", tag, CONSTANT_POOL_TAGS_TO_HANDLER[tag].__name__)
    CONSTANT_POOL_TAGS_TO_HANDLER[tag](resolver)
>>  10 do_CONSTANT_Methodref_info
>>  9 do_CONSTANT_Fieldref_info
>>  7 do_CONSTANT_Class_info
>>  7 do_CONSTANT_Class_info
>>  1 do_CONSTANT_Utf8_info
>>  1 do_CONSTANT_Utf8_info
>>  1 do_CONSTANT_Utf8_info
>>  1 do_CONSTANT_Utf8_info
>>  1 do_CONSTANT_Utf8_info
>>  1 do_CONSTANT_Utf8_info
>>  1 do_CONSTANT_Utf8_info
>>  1 do_CONSTANT_Utf8_info
>>  1 do_CONSTANT_Utf8_info
>>  1 do_CONSTANT_Utf8_info
>>  1 do_CONSTANT_Utf8_info
>>  1 do_CONSTANT_Utf8_info
>>  1 do_CONSTANT_Utf8_info
>>  1 do_CONSTANT_Utf8_info
>>  1 do_CONSTANT_Utf8_info
>>  1 do_CONSTANT_Utf8_info
>>  1 do_CONSTANT_Utf8_info
>>  12 do_CONSTANT_NameAndType_info
>>  12 do_CONSTANT_NameAndType_info
>>  1 do_CONSTANT_Utf8_info
>>  1 do_CONSTANT_Utf8_info

2.5 access_flags;¶

Flag Name Value Interpretation
ACC_PUBLIC 0x0001 Declared public; may be accessed from outside its package.
ACC_FINAL 0x0010 Declared final; no subclasses allowed.
ACC_SUPER 0x0020 Treat superclass methods specially when invoked by the invokespecial instruction.
ACC_INTERFACE 0x0200 Is an interface, not a class.
ACC_ABSTRACT 0x0400 Declared abstract; must not be instantiated.
ACC_SYNTHETIC 0x1000 Declared synthetic; not present in the source code.
ACC_ANNOTATION 0x2000 Declared as an annotation type.
ACC_ENUM 0x4000 Declared as an enum type.
In [ ]:
import json
from json.encoder import JSONEncoder
class CustEncoder(JSONEncoder):
    def default(self, o):
        if isinstance(o, (bytes, bytearray)):
            return str(o)
        else:
            return super().default(o)


print(json.dumps(resolver, indent=4, cls=CustEncoder))
In [62]:
from bs4 import BeautifulSoup 
from collections import namedtuple
import re
import pandas as pd
AcsFlag = namedtuple("AccessFlag", ["flag_name", "value", "iterpretation"])
ALL_ACCESS_FLAGS: dict = {}
In [63]:
data = """
                     <table summary="Class access and property modifiers" border="1">
                              <colgroup>
                                 <col>
                                 <col>
                                 <col>
                              </colgroup>
                              <thead>
                                 <tr>
                                    <th>Flag Name</th>
                                    <th>Value</th>
                                    <th>Interpretation</th>
                                 </tr>
                              </thead>
                              <tbody>
                                 <tr>
                                    <td><code class="literal">ACC_PUBLIC</code></td>
                                    <td>0x0001</td>
                                    <td>Declared <code class="literal">public</code>; may be accessed from outside its
                                       		package.
                                    </td>
                                 </tr>
                                 <tr>
                                    <td><code class="literal">ACC_FINAL</code></td>
                                    <td>0x0010</td>
                                    <td>Declared <code class="literal">final</code>; no subclasses allowed.
                                    </td>
                                 </tr>
                                 <tr>
                                    <td><code class="literal">ACC_SUPER</code></td>
                                    <td>0x0020</td>
                                    <td>Treat superclass methods specially when invoked
                                       		by the <span class="emphasis"><em>invokespecial</em></span> instruction.
                                    </td>
                                 </tr>
                                 <tr>
                                    <td><code class="literal">ACC_INTERFACE</code></td>
                                    <td>0x0200</td>
                                    <td>Is an interface, not a class.</td>
                                 </tr>
                                 <tr>
                                    <td><code class="literal">ACC_ABSTRACT</code></td>
                                    <td>0x0400</td>
                                    <td>Declared <code class="literal">abstract</code>; must not be
                                       		instantiated.
                                    </td>
                                 </tr>
                                 <tr>
                                    <td><code class="literal">ACC_SYNTHETIC</code></td>
                                    <td>0x1000</td>
                                    <td>Declared synthetic; not present in the source
                                       		code.
                                    </td>
                                 </tr>
                                 <tr>
                                    <td><code class="literal">ACC_ANNOTATION</code></td>
                                    <td>0x2000</td>
                                    <td>Declared as an annotation type.</td>
                                 </tr>
                                 <tr>
                                    <td><code class="literal">ACC_ENUM</code></td>
                                    <td>0x4000</td>
                                    <td>Declared as an <code class="literal">enum</code> type.
                                    </td>
                                 </tr>
                              </tbody>
                           </table>
"""
In [64]:
def parse_access_flags_from_html(html):
    soup = BeautifulSoup(html)
    for tr in soup.table.select("tr"):
        tds = tr.select("td")
        if len(tds) == 3:
            acs_flag = AcsFlag(
                *(list(map(lambda td: re.sub(r"\s", " ", td.text).strip(), tds))))
            ALL_ACCESS_FLAGS[bytes.fromhex(acs_flag.value.replace('0x', ''))] = acs_flag
parse_access_flags_from_html(data)
# pprint
pd.DataFrame(ALL_ACCESS_FLAGS, index=["Flag Name", "Value", "Interpretation"]).T
Out[64]:
Flag Name Value Interpretation
b'\x00\x01' ACC_PUBLIC 0x0001 Declared public; may be accessed from outside ...
b'\x00\x10' ACC_FINAL 0x0010 Declared final; no subclasses allowed.
b'\x00 ' ACC_SUPER 0x0020 Treat superclass methods specially when invoke...
b'\x02\x00' ACC_INTERFACE 0x0200 Is an interface, not a class.
b'\x04\x00' ACC_ABSTRACT 0x0400 Declared abstract; must not be ...
b'\x10\x00' ACC_SYNTHETIC 0x1000 Declared synthetic; not present in the source ...
b' \x00' ACC_ANNOTATION 0x2000 Declared as an annotation type.
b'@\x00' ACC_ENUM 0x4000 Declared as an enum type.
In [65]:
from typing import List


def parse_access_flags_arr(access_flags: Union[bytes, int]) -> List[str]:
    if isinstance(access_flags, tuple):
        access_flags = access_flags[-1]
        
    if isinstance(access_flags, bytes):
        acs_flags_ival = int.from_bytes(resolver.access_flags[-1], "big",signed=False)  
    else:
        acs_flags_ival = access_flags
    res = []
    for bytes_k, acs_flag in ALL_ACCESS_FLAGS.items():
        if acs_flags_ival & struct.unpack('>H', bytes_k)[-1]:
            res.append(acs_flag.flag_name)
    
    return res
    
In [66]:
resolver.access_flags = resolver.next(2, RTEnum.bytes_)
# bind 访问符数组
# acs_flags_ival = int.from_bytes(resolver.access_flags[-1], "big",signed=False)
# acs_flags_ival = struct.unpack('>H', resolver.access_flags[-1])[-1]
resolver.access_flags_arr = parse_access_flags_arr(resolver.access_flags)
resolver.access_flags, resolver.access_flags_arr
Out[66]:
((305, b'\x00!'), ['ACC_PUBLIC', 'ACC_SUPER'])

2.6 this_class;¶

In [67]:
resolver.this_class = resolver.next(2, RTEnum.int_)
resolver.constant_pool[resolver.this_class[-1]]
Out[67]:
{'tag': 'CONSTANT_Class_info', 'name_index': (21, 24)}

2.7 super_class;¶

In [68]:
resolver.super_class = resolver.next(2, RTEnum.int_)
resolver.constant_pool[resolver.super_class[-1]]
Out[68]:
{'tag': 'CONSTANT_Class_info', 'name_index': (24, 25)}

2.8 interfaces_count;¶

In [69]:
resolver.interfaces_count = resolver.next(2, RTEnum.int_)
resolver.interfaces_count
Out[69]:
(311, 0)

2.9 interfaces[interfaces_count];¶

In [70]:
resolver.interfaces = []
for intf in range(resolver.interfaces_count[-1]):
    resolver.interfaces.append(resolver.next(2, RTEnum.int_))
resolver.interfaces
Out[70]:
[]

2.10 fields_count;¶

In [71]:
resolver.fields_count = resolver.next(2, RTEnum.int_)
resolver.fields_count
Out[71]:
(313, 1)

2.11 fields[fields_count];¶

Attribute¶

Attribute Section class file Java SE
ConstantValue §4.7.2 45.3 1.0.2
Code §4.7.3 45.3 1.0.2
StackMapTable §4.7.4 50.0 6
Exceptions §4.7.5 45.3 1.0.2
InnerClasses §4.7.6 45.3 1.1
EnclosingMethod §4.7.7 49.0 5.0
Synthetic §4.7.8 45.3 1.1
Signature §4.7.9 49.0 5.0
SourceFile §4.7.10 45.3 1.0.2
SourceDebugExtension §4.7.11 49.0 5.0
LineNumberTable §4.7.12 45.3 1.0.2
LocalVariableTable §4.7.13 45.3 1.0.2
LocalVariableTypeTable §4.7.14 49.0 5.0
Deprecated §4.7.15 45.3 1.1
RuntimeVisibleAnnotations §4.7.16 49.0 5.0
RuntimeInvisibleAnnotations §4.7.17 49.0 5.0
RuntimeVisibleParameterAnnotations §4.7.18 49.0 5.0
RuntimeInvisibleParameterAnnotations §4.7.19 49.0 5.0
RuntimeVisibleTypeAnnotations §4.7.20 52.0 8
RuntimeInvisibleTypeAnnotations §4.7.21 52.0 8
AnnotationDefault §4.7.22 49.0 5.0
BootstrapMethods §4.7.23 51.0 7
MethodParameters §4.7.24 52.0 8
In [ ]:
CONSTANT_POOL_TAGS_TO_HANDLER = {
    7: do_CONSTANT_Class_info,
    9: do_CONSTANT_Fieldref_info,
    10: do_CONSTANT_Methodref_info,
    11: do_CONSTANT_InterfaceMethodref_info,
    8: do_CONSTANT_String_info,
    3: do_CONSTANT_Integer_info,
    4: do_CONSTANT_Float_info,
    5: do_CONSTANT_Long_info,
    6: do_CONSTANT_Double_info,
    12: do_CONSTANT_NameAndType_info,
    1: do_CONSTANT_Utf8_info,
    15: do_CONSTANT_MethodHandle_info,
    16: do_CONSTANT_MethodType_info,
    18: do_CONSTANT_InvokeDynamic_info,
}
In [7]:
# region common parse
def do_common_attribute(resolver: Resolver, attribute_info: dict):
    attribute_info["attribute_name_index"] = resolver.next(2, RTEnum.int_)
    attribute_info["attribute_length"] = resolver.next(4, RTEnum.int_)

import re
EXP_PTN = re.compile(r".*(?P<len>u\d)\s+(?P<key>\w+);.*")
def do_exp(resolver: Resolver, exp_or_exps: str, res: dict=None, rtype: RTEnum = RTEnum.int_):
    
    if res is None:
        res = {}
    
    for exp in exp_or_exps.split("\n"):   
        if len(exp.strip()) == 0:
            continue

        matcher = EXP_PTN.match(exp)
        if matcher:
            res[matcher.group("key")] = resolver.next(matcher.group("len"), rtype)
            print(matcher.groupdict())
        else:
            print("Unknown exp: ", exp)
    
    return res

# endregion common parse


def parse_ConstantValue_attribute(resolver: Resolver):
    """
    ConstantValue_attribute {
        u2 attribute_name_index;
        u4 attribute_length;
        u2 constantvalue_index;
    }
    """
    # attribute_info = {}
    # do_common_attribute(resolver, attribute_info)
    # attribute_info["constantvalue_index"] = resolver.next(2, RTEnum.int_)
    # return attribute_info
    return do_exp(resolver, parse_ConstantValue_attribute.__doc__)


    
def parse_Code_attribute(resolver: Resolver):
    """
    Code_attribute {
        u2 attribute_name_index;
        u4 attribute_length;
        u2 max_stack;
        u2 max_locals;
        u4 code_length;
        u1 code[code_length];
        u2 exception_table_length;
        {   u2 start_pc;
            u2 end_pc;
            u2 handler_pc;
            u2 catch_type;
        } exception_table[exception_table_length];
        u2 attributes_count;
        attribute_info attributes[attributes_count];
    }
    """
    attribute_info = {}
    do_common_attribute(resolver, attribute_info)
    do_exp(resolver, """
            u2 max_stack;
            u2 max_locals;
            u4 code_length;
            """, attribute_info, RTEnum.int_)
        
    attribute_info["code"] = resolver.next(attribute_info["code_length"], RTEnum.bytes_)
    do_exp(resolver, "u2 exception_table_length;", attribute_info, RTEnum.int_)
    attribute_info["exception_table"] = []
    for _ in range(attribute_info["exception_table_length"]):
        attribute_info["exception_table"].append(
            do_exp(
                resolver, 
                """ 
                {   u2 start_pc;
                    u2 end_pc;
                    u2 handler_pc;
                    u2 catch_type;
                """,
                rtype = RTEnum.int_
            )
        )
    do_exp(resolver, "u2 attributes_count;", attribute_info)
    # TODO attribute_info attributes[attributes_count];
    return attribute_info

def parse_StackMapTable_attribute(resolver: Resolver):
    '''
    StackMapTable_attribute {
        u2              attribute_name_index;
        u4              attribute_length;
        u2              number_of_entries;
        stack_map_frame entries[number_of_entries];
    }
    '''
    attr_info = do_exp(resolver, parse_StackMapTable_attribute.__doc__)
    # TODO stack_map_frame entries[number_of_entries]; 
    return attr_info


def parse_Exceptions_attribute(resolver: Resolver):
    '''
    Exceptions_attribute {
        u2 attribute_name_index;
        u4 attribute_length;
        u2 number_of_exceptions;
        u2 exception_index_table[number_of_exceptions];
    }
    '''
    attr_info = do_exp(resolver, 
                    '''
                    u2 attribute_name_index;
                    u4 attribute_length;
                    u2 number_of_exceptions;
                    ''')
    attr_info['exception_index_table'] = []
    for exception_index in range(attr_info['number_of_exceptions']):
        attr_info['exception_index_table'].append(resolver.next('u2', RTEnum.int_))
    return attr_info
    
def parse_Exceptions_attribute(resolver: Resolver):
    '''
    Exceptions_attribute {
        u2 attribute_name_index;
        u4 attribute_length;
        u2 number_of_exceptions;
        u2 exception_index_table[number_of_exceptions];
    }
    '''
    attr_info = do_exp(resolver, 
                    '''
                    u2 attribute_name_index;
                    u4 attribute_length;
                    u2 number_of_exceptions;
                    ''')
    attr_info['exception_index_table'] = []
    for exception_index in range(attr_info['number_of_exceptions']):
        attr_info['exception_index_table'].append(resolver.next('u2', RTEnum.int_))
    return attr_info


def parse_attribute_info(resolver: Resolver) -> dict:
    """
    attribute_info {
        u2 attribute_name_index;
        u4 attribute_length;
        u1 info[attribute_length];
    }
    Args:
        resolver (Resolver): _description_
    """
    attribute_info = {}
    attribute_info["attribute_name_index"] = resolver.next(2, RTEnum.int_)
    attribute_info["attribute_length"] = resolver.next(4, RTEnum.int_)
    # TODO 需要详细解析
    attribute_info["info"] = resolver.next(attribute_info["attribute_length"][-1], RTEnum.bytes_)
    return attribute_info
        
In [35]:
import json
import types


ATTR_TAGS_TO_HANDLER = {}
for k, v in globals().items():
    if isinstance(v, types.FunctionType) and k.endswith("_attribute"):
        k = k.replace("parse_", "")
        print("add handler %s: %s" % (k, v))
        ATTR_TAGS_TO_HANDLER[k]= v
add handler do_common_attribute:<function do_common_attribute at 0x000001727063E620>
add handler ConstantValue_attribute:<function parse_ConstantValue_attribute at 0x000001727063E378>
add handler Code_attribute:<function parse_Code_attribute at 0x000001727063E8C8>
add handler StackMapTable_attribute:<function parse_StackMapTable_attribute at 0x000001727063E950>
add handler Exceptions_attribute:<function parse_Exceptions_attribute at 0x000001727063EA60>
In [41]:
json.dumps(json.loads("""{\"RETCODE\":\"AAAAAAA\",\"TRANSERIAL\":\"PWAP01710019717764284416\",\"TOTALNM\":\"10\",\"resultList\":[{\"RESDATE\":\"\",\"NAV\":\"1.0000\",\"IPOMODE\":\"0\",\"STARTAMT\":\"1.00\",\"EXTCHARGEFLAG\":\"0\",\"LVALDATE\":\"\",\"PRDDEADLINE\":\"104\",\"INSTFLAG\":\"0\",\"NVALDATE\":\"\",\"PRDSTTNM\":\"募集期\",\"MINHOLDTERMUNIT\":\"\",\"INCOMERATE\":\"\",\"EXPLAIN\":\"\",\"IPOSTARTDATE\":\"20221128\",\"PURCHASEMODE\":\"1\",\"ISONLINESALE\":\"4\",\"RISKLEVEL_Show\":\"较低风险\",\"BOOKBUYDATE\":\"0\",\"CITYCODE\":\"\",\"GUESTMIDRATIO\":\"\",\"AREACN\":\"\",\"IPOENDDATE\":\"20221205\",\"PRDSTT_Show\":\"募集期\",\"TIMEPOINTASSETSCTL\":\"\",\"PRDSTAGE\":\"\",\"BILLFLAG\":\"0\",\"SECRESENDTIME\":\"000000\",\"FSTRESSTARTTIME\":\"000000\",\"GUESTRATIO\":\"0.00000\",\"TAFLAG\":\"1\",\"LATENAVDATE\":\"\",\"MINHOLDTERM\":\"\",\"AUTOINVESTFLAG\":\"0\",\"CLOSETIMEBYE\":\"0\",\"TOTUSEAMT\":\"1699369173.28\",\"LASTMONSNAVDATE\":\"0\",\"FSTRESSTARTDATE\":\"0\",\"JZHBINCOM\":\"2.750-3.050%\",\"SECRESENDDATE\":\"0\",\"OPENDAY\":\"0\",\"SHARECLASS\":\"0\",\"PRDSTT\":\"1\",\"LASTMONSRATE\":\"0.000000000000\",\"TANAME\":\"信银理财有限责任公司\",\"LASTMONSNAV\":\"0.000000000000\",\"LOCKDAYS\":\"0\",\"PRDTYPE\":\"1\",\"ISYUEDONGPRD\":\"0\",\"transClients\":\"bcde01245\",\"FINCPRDBAL\":\"1699369173.28\",\"AREANO\":\"\",\"CURRENTHACAPITALGT\":\"0.00\",\"VALUE\":\"\",\"SECRESSTARTTIME\":\"000000\",\"INCOMEFLAG\":\"\",\"ISOPENDAY\":\"N\",\"PRDSTYLE\":\"\",\"FSTRESENDTIME\":\"000000\",\"INDESCRIPTION\":\"业绩比较基准\",\"CURRTYPE\":\"001\",\"ISSHORTTERM\":\"0\",\"INVESTCYC\":\"0\",\"PLEDGEFLAG\":\"0\",\"BOOKBUYDAYS\":\"0\",\"LATENAV\":\"\",\"AUTOINVESTDATE\":\"20221206\",\"LIMITFLAG\":\"1\",\"UNIT\":\"0.00\",\"FSTRESENDDATE\":\"0\",\"PREVAUMASSETGT\":\"0.00\",\"SNDFLAG\":\"0\",\"FINCTAGJSONSTR\":\"null\",\"INCOMEUNIT\":\"\",\"OPENPERIODFLAG\":\"\",\"RECOMMENDFLAG\":\"1000000000\",\"CLOSETIME\":\"153000\",\"LASTINCOMERATE\":\"0.000000000000\",\"RESFLAG\":\"0\",\"AVAILIMIT\":\"\",\"OPENPERIODDAY\":\"0\",\"PRINCIPALFLAG\":\"0\",\"CALACCORD\":\"产品业绩基准是在产品说明书约定的投资范围内,根据产品投资策略、市场环境和各类资产的投资比例及收益率水平进行综合测算而得出,业绩基准为2.75%-3.05%。\",\"RESAMT\":\"\",\"LASTMONS\":\"-1\",\"BOOKSELLDATE\":\"0\",\"CURRTYPE_Show\":\"人民币\",\"PRDNAME\":\"(闲钱+)安盈象固收稳健三个月封闭式1号A\",\"PRDATTR\":\"0\",\"TACODE\":\"YZX\",\"OPENPERIOD\":\"0\",\"ISVALID\":\"1\",\"PRDCODE\":\"AF221458A\",\"TURNNO\":\"\",\"TOTSELLLMS\":\"2000000000.00\",\"PASSINVESTORSCTL\":\"\",\"CHANNELS\":\"0137\",\"CLOSEDATE\":\"20230320\",\"NAVDATE\":\"20221201\",\"RISKLEVEL\":\"2\",\"NTMKTFLAG\":\"\",\"SECRESSTARTDATE\":\"0\",\"TRANSSTATUS\":\"100 00 0 0000000000000 000000 00000000 0000000000001000001100000000000000000000000000000000000000\",\"GUESTMAXRATIO\":\"\",\"TASHORTNAME\":\"信银理财\",\"GUESTMINRATIO\":\"\",\"ELECFLAG\":\"0\",\"RESERVED\":\"0\",\"CPFL\":\"5\",\"BOOKBUYFLAG\":\"0\",\"TRANSMODE\":\"2\",\"transClientsCN\":\"富裕客户、贵宾客户、私行客户、大众客户、个人普通客户、个人金卡客户、个人白金客户、个人钻石客户、黑金卡客户\",\"PSALEFLAG\":\"0\"},{\"RESDATE\":\"\",\"NAV\":\"1.0297\",\"IPOMODE\":\"0\",\"STARTAMT\":\"1000000.00\",\"EXTCHARGEFLAG\":\"0\",\"LVALDATE\":\"\",\"PRDDEADLINE\":\"0\",\"INSTFLAG\":\"0\",\"NVALDATE\":\"\",\"PRDSTTNM\":\"停止交易\",\"MINHOLDTERMUNIT\":\"0\",\"INCOMERATE\":\"\",\"EXPLAIN\":\"\",\"IPOSTARTDATE\":\"20220301\",\"PURCHASEMODE\":\"1\",\"ISONLINESALE\":\"4\",\"RISKLEVEL_Show\":\"较低风险\",\"BOOKBUYDATE\":\"20221205\",\"CITYCODE\":\"\",\"GUESTMIDRATIO\":\"\",\"AREACN\":\"\",\"IPOENDDATE\":\"20220307\",\"PRDSTT_Show\":\"停止交易\",\"TIMEPOINTASSETSCTL\":\"\",\"PRDSTAGE\":\"\",\"BILLFLAG\":\"0\",\"SECRESENDTIME\":\"000000\",\"FSTRESSTARTTIME\":\"000000\",\"GUESTRATIO\":\"0.00000\",\"TAFLAG\":\"1\",\"LATENAVDATE\":\"\",\"MINHOLDTERM\":\"3\",\"AUTOINVESTFLAG\":\"0\",\"CLOSETIMEBYE\":\"0\",\"TOTUSEAMT\":\"49999023077.00\",\"LASTMONSNAVDATE\":\"20221031\",\"FSTRESSTARTDATE\":\"0\",\"JZHBINCOM\":\"3.930%\",\"SECRESENDDATE\":\"0\",\"OPENDAY\":\"0\",\"SHARECLASS\":\"0\",\"PRDSTT\":\"4\",\"LASTMONSRATE\":\"0.002824000000\",\"TANAME\":\"光大理财有限责任公司\",\"LASTMONSNAV\":\"1.026800000000\",\"LOCKDAYS\":\"0\",\"PRDTYPE\":\"1\",\"ISYUEDONGPRD\":\"0\",\"transClients\":\"bcde01245\",\"FINCPRDBAL\":\"49999023077.00\",\"AREANO\":\"\",\"CURRENTHACAPITALGT\":\"0.00\",\"VALUE\":\"\",\"SECRESSTARTTIME\":\"000000\",\"INCOMEFLAG\":\"\",\"ISOPENDAY\":\"N\",\"PRDSTYLE\":\"\",\"FSTRESENDTIME\":\"000000\",\"INDESCRIPTION\":\"近6月年化收益率\",\"CURRTYPE\":\"001\",\"ISSHORTTERM\":\"0\",\"INVESTCYC\":\"0\",\"PLEDGEFLAG\":\"0\",\"BOOKBUYDAYS\":\"14\",\"LATENAV\":\"\",\"AUTOINVESTDATE\":\"20220308\",\"LIMITFLAG\":\"1\",\"UNIT\":\"0.00\",\"FSTRESENDDATE\":\"0\",\"PREVAUMASSETGT\":\"0.00\",\"SNDFLAG\":\"0\",\"FINCTAGJSONSTR\":\"null\",\"INCOMEUNIT\":\"\",\"OPENPERIODFLAG\":\"0\",\"RECOMMENDFLAG\":\"1000000000\",\"CLOSETIME\":\"150000\",\"LASTINCOMERATE\":\"0.000000000000\",\"RESFLAG\":\"0\",\"AVAILIMIT\":\"\",\"OPENPERIODDAY\":\"90\",\"PRINCIPALFLAG\":\"0\",\"CALACCORD\":\"本产品资金主要投资于债券、优先股、非标准化债权类资产等以绝对收益为目标的资产。业绩比较基准基于本产品策略,根据中债总财富(1-3年)指数以及中证800指数收益率相关数据模拟回测。\",\"RESAMT\":\"\",\"LASTMONS\":\"1\",\"BOOKSELLDATE\":\"20221205\",\"CURRTYPE_Show\":\"人民币\",\"PRDNAME\":\"(安心+)阳光橙安盈增强季开2号I(私银)\",\"PRDATTR\":\"0\",\"TACODE\":\"EW\",\"OPENPERIOD\":\"3\",\"ISVALID\":\"1\",\"PRDCODE\":\"EW377I\",\"TURNNO\":\"\",\"TOTSELLLMS\":\"51200000000.00\",\"PASSINVESTORSCTL\":\"\",\"CHANNELS\":\"0137\",\"CLOSEDATE\":\"20991231\",\"NAVDATE\":\"20221130\",\"RISKLEVEL\":\"2\",\"NTMKTFLAG\":\"\",\"SECRESSTARTDATE\":\"0\",\"TRANSSTATUS\":\"001 00 1 0000000000000 000000 00000000 0000000000000000001100000000000000000000000000000000000000\",\"GUESTMAXRATIO\":\"\",\"TASHORTNAME\":\"光大理财\",\"GUESTMINRATIO\":\"\",\"ELECFLAG\":\"0\",\"RESERVED\":\"0\",\"CPFL\":\"5\",\"BOOKBUYFLAG\":\"1\",\"TRANSMODE\":\"0\",\"transClientsCN\":\"富裕客户、贵宾客户、私行客户、大众客户、个人普通客户、个人金卡客户、个人白金客户、个人钻石客户、黑金卡客户\",\"PSALEFLAG\":\"0\"},{\"RESDATE\":\"\",\"NAV\":\"1.0666\",\"IPOMODE\":\"0\",\"STARTAMT\":\"1.00\",\"EXTCHARGEFLAG\":\"0\",\"LVALDATE\":\"20220831\",\"PRDDEADLINE\":\"0\",\"INSTFLAG\":\"0\",\"NVALDATE\":\"20221130\",\"PRDSTTNM\":\"停止交易\",\"MINHOLDTERMUNIT\":\"0\",\"INCOMERATE\":\"\",\"EXPLAIN\":\"固收投资,风格稳健,每季度开放流动性优\",\"IPOSTARTDATE\":\"20210222\",\"PURCHASEMODE\":\"1\",\"ISONLINESALE\":\"4\",\"RISKLEVEL_Show\":\"较低风险\",\"BOOKBUYDATE\":\"20221207\",\"CITYCODE\":\"\",\"GUESTMIDRATIO\":\"\",\"AREACN\":\"\",\"IPOENDDATE\":\"20210302\",\"PRDSTT_Show\":\"停止交易\",\"TIMEPOINTASSETSCTL\":\"\",\"PRDSTAGE\":\"\",\"BILLFLAG\":\"0\",\"SECRESENDTIME\":\"000000\",\"FSTRESSTARTTIME\":\"000000\",\"GUESTRATIO\":\"0.00000\",\"TAFLAG\":\"1\",\"LATENAVDATE\":\"\",\"MINHOLDTERM\":\"3\",\"AUTOINVESTFLAG\":\"0\",\"CLOSETIMEBYE\":\"0\",\"TOTUSEAMT\":\"2105514515.53\",\"LASTMONSNAVDATE\":\"20221102\",\"FSTRESSTARTDATE\":\"0\",\"JZHBINCOM\":\"3.528%\",\"SECRESENDDATE\":\"0\",\"OPENDAY\":\"7\",\"SHARECLASS\":\"0\",\"PRDSTT\":\"4\",\"LASTMONSRATE\":\"0.002726000000\",\"TANAME\":\"信银理财有限责任公司\",\"LASTMONSNAV\":\"1.063700000000\",\"LOCKDAYS\":\"0\",\"PRDTYPE\":\"1\",\"ISYUEDONGPRD\":\"0\",\"transClients\":\"bcde01245\",\"FINCPRDBAL\":\"2105514515.53\",\"AREANO\":\"\",\"CURRENTHACAPITALGT\":\"0.00\",\"VALUE\":\"1.06660000\",\"SECRESSTARTTIME\":\"000000\",\"INCOMEFLAG\":\"0\",\"ISOPENDAY\":\"N\",\"PRDSTYLE\":\"1\",\"FSTRESENDTIME\":\"000000\",\"INDESCRIPTION\":\"近3月年化收益率\",\"CURRTYPE\":\"001\",\"ISSHORTTERM\":\"0\",\"INVESTCYC\":\"0\",\"PLEDGEFLAG\":\"0\",\"BOOKBUYDAYS\":\"14\",\"LATENAV\":\"\",\"AUTOINVESTDATE\":\"20210304\",\"LIMITFLAG\":\"1\",\"UNIT\":\"0.00\",\"FSTRESENDDATE\":\"0\",\"PREVAUMASSETGT\":\"0.00\",\"SNDFLAG\":\"0\",\"FINCTAGJSONSTR\":\"null\",\"INCOMEUNIT\":\"\",\"OPENPERIODFLAG\":\"0\",\"RECOMMENDFLAG\":\"1000000000\",\"CLOSETIME\":\"153000\",\"LASTINCOMERATE\":\"0.438755250596\",\"RESFLAG\":\"0\",\"AVAILIMIT\":\"\",\"OPENPERIODDAY\":\"90\",\"PRINCIPALFLAG\":\"0\",\"CALACCORD\":\"目前同盈象系列理财产品属性为固收类产品,底仓主要投资银行间短融中票、PPN、交易所非公开公司债等信用债品种和少量同业存单。根据当前市场利率水平、组合目标久期、可投资债券的静态收益率、债券杠杆操作等因素作为测算依据,扣除相关税费成本后,综合得出产品的业绩基准。\",\"RESAMT\":\"\",\"LASTMONS\":\"1\",\"BOOKSELLDATE\":\"20221207\",\"CURRTYPE_Show\":\"人民币\",\"PRDNAME\":\"同盈象固收稳健季开3号\",\"PRDATTR\":\"0\",\"TACODE\":\"YZX\",\"OPENPERIOD\":\"3\",\"ISVALID\":\"1\",\"PRDCODE\":\"AF21A2085\",\"TURNNO\":\"\",\"TOTSELLLMS\":\"6100000000.00\",\"PASSINVESTORSCTL\":\"\",\"CHANNELS\":\"0137\",\"CLOSEDATE\":\"20991229\",\"NAVDATE\":\"20221130\",\"RISKLEVEL\":\"2\",\"NTMKTFLAG\":\"\",\"SECRESSTARTDATE\":\"0\",\"TRANSSTATUS\":\"001 00 1 0000000000000 000000 00000000 0000000000000000001100000000000000000000000000000000000000\",\"GUESTMAXRATIO\":\"\",\"TASHORTNAME\":\"信银理财\",\"GUESTMINRATIO\":\"\",\"ELECFLAG\":\"0\",\"RESERVED\":\"0\",\"CPFL\":\"5\",\"BOOKBUYFLAG\":\"1\",\"TRANSMODE\":\"0\",\"transClientsCN\":\"富裕客户、贵宾客户、私行客户、大众客户、个人普通客户、个人金卡客户、个人白金客户、个人钻石客户、黑金卡客户\",\"PSALEFLAG\":\"0\"},{\"RESDATE\":\"\",\"NAV\":\"1.0000\",\"IPOMODE\":\"0\",\"STARTAMT\":\"1000000.00\",\"EXTCHARGEFLAG\":\"0\",\"LVALDATE\":\"\",\"PRDDEADLINE\":\"0\",\"INSTFLAG\":\"0\",\"NVALDATE\":\"\",\"PRDSTTNM\":\"募集期\",\"MINHOLDTERMUNIT\":\"0\",\"INCOMERATE\":\"\",\"EXPLAIN\":\"\",\"IPOSTARTDATE\":\"20221122\",\"PURCHASEMODE\":\"1\",\"ISONLINESALE\":\"4\",\"RISKLEVEL_Show\":\"较低风险\",\"BOOKBUYDATE\":\"20221207\",\"CITYCODE\":\"\",\"GUESTMIDRATIO\":\"\",\"AREACN\":\"\",\"IPOENDDATE\":\"20221202\",\"PRDSTT_Show\":\"募集期\",\"TIMEPOINTASSETSCTL\":\"\",\"PRDSTAGE\":\"\",\"BILLFLAG\":\"0\",\"SECRESENDTIME\":\"000000\",\"FSTRESSTARTTIME\":\"000000\",\"GUESTRATIO\":\"0.00000\",\"TAFLAG\":\"1\",\"LATENAVDATE\":\"\",\"MINHOLDTERM\":\"15\",\"AUTOINVESTFLAG\":\"0\",\"CLOSETIMEBYE\":\"0\",\"TOTUSEAMT\":\"4333910451.83\",\"LASTMONSNAVDATE\":\"0\",\"FSTRESSTARTDATE\":\"0\",\"JZHBINCOM\":\"3.650-4.450%\",\"SECRESENDDATE\":\"0\",\"OPENDAY\":\"22\",\"SHARECLASS\":\"0\",\"PRDSTT\":\"1\",\"LASTMONSRATE\":\"0.000000000000\",\"TANAME\":\"信银理财有限责任公司\",\"LASTMONSNAV\":\"0.000000000000\",\"LOCKDAYS\":\"0\",\"PRDTYPE\":\"1\",\"ISYUEDONGPRD\":\"0\",\"transClients\":\"bcde01245\",\"FINCPRDBAL\":\"4333910451.83\",\"AREANO\":\"\"
                      ,\"CURRENTHACAPITALGT\":\"0.00\",\"VALUE\":\"\",\"SECRESSTARTTIME\":\"000000\",\"INCOMEFLAG\":\"\",\"ISOPENDAY\":\"N\",\"PRDSTYLE\":\"\",\"FSTRESENDTIME\":\"000000\",\"INDESCRIPTION\":\"业绩比较基准\",\"CURRTYPE\":\"001\",\"ISSHORTTERM\":\"0\",\"INVESTCYC\":\"0\",\"PLEDGEFLAG\":\"0\",\"BOOKBUYDAYS\":\"14\",\"LATENAV\":\"\",\"AUTOINVESTDATE\":\"20221205\",\"LIMITFLAG\":\"1\",\"UNIT\":\"0.00\",\"FSTRESENDDATE\":\"0\",\"PREVAUMASSETGT\":\"0.00\",\"SNDFLAG\":\"0\",\"FINCTAGJSONSTR\":\"null\",\"INCOMEUNIT\":\"\",\"OPENPERIODFLAG\":\"0\",\"RECOMMENDFLAG\":\"1000000000\",\"CLOSETIME\":\"153000\",\"LASTINCOMERATE\":\"0.000000000000\",\"RESFLAG\":\"0\",\"AVAILIMIT\":\"\",\"OPENPERIODDAY\":\"420\",\"PRINCIPALFLAG\":\"0\",\"CALACCORD\":\"全盈象固收稳健系列理财产品属性为固收类产品,底仓主要投资银行间短融中票、PPN、交易所非公开公司债等信用债品种、非标准化债权类资产、在银行间市场和证券交易所市场发行的资产支持证券、非公开定向债务融资工具、债券型证券投资基金,以及同业存单等少量货币市场类资产。本产品为100%债权类资产,其中非标准化债券类资产不超过49%。根据当前市场利率水平、组合目标久期、可投资债券的静态收益率、债券杠杆操作等因素作为测算依据,扣除相关税费成本后,综合得出本产品业绩基准。\",\"RESAMT\":\"\",\"LASTMONS\":\"-1\",\"BOOKSELLDATE\":\"20240222\",\"CURRTYPE_Show\":\"人民币\",\"PRDNAME\":\"全盈象固收稳健十四个月定开6号D\",\"PRDATTR\":\"0\",\"TACODE\":\"YZX\",\"OPENPERIOD\":\"14\",\"ISVALID\":\"1\",\"PRDCODE\":\"AF222705D\",\"TURNNO\":\"\",\"TOTSELLLMS\":\"5000000000.00\",\"PASSINVESTORSCTL\":\"\",\"CHANNELS\":\"0137\",\"CLOSEDATE\":\"20991229\",\"NAVDATE\":\"20221201\",\"RISKLEVEL\":\"2\",\"NTMKTFLAG\":\"\",\"SECRESSTARTDATE\":\"0\",\"TRANSSTATUS\":\"001 00 0 0000000000000 000000 00000000 0000000000001000001100000000000000000000000000000000000000\",\"GUESTMAXRATIO\":\"\",\"TASHORTNAME\":\"信银理财\",\"GUESTMINRATIO\":\"\",\"ELECFLAG\":\"0\",\"RESERVED\":\"0\",\"CPFL\":\"5\",\"BOOKBUYFLAG\":\"1\",\"TRANSMODE\":\"0\",\"transClientsCN\":\"富裕客户、贵宾客户、私行客户、大众客户、个人普通客户、个人金卡客户、个人白金客户、个人钻石客户、黑金卡客户\",\"PSALEFLAG\":\"0\"},{\"RESDATE\":\"\",\"NAV\":\"1.0000\",\"IPOMODE\":\"0\",\"STARTAMT\":\"1.00\",\"EXTCHARGEFLAG\":\"0\",\"LVALDATE\":\"\",\"PRDDEADLINE\":\"0\",\"INSTFLAG\":\"0\",\"NVALDATE\":\"\",\"PRDSTTNM\":\"募集期\",\"MINHOLDTERMUNIT\":\"0\",\"INCOMERATE\":\"\",\"EXPLAIN\":\"\",\"IPOSTARTDATE\":\"20221128\",\"PURCHASEMODE\":\"1\",\"ISONLINESALE\":\"4\",\"RISKLEVEL_Show\":\"较低风险\",\"BOOKBUYDATE\":\"20221208\",\"CITYCODE\":\"\",\"GUESTMIDRATIO\":\"\",\"AREACN\":\"\",\"IPOENDDATE\":\"20221205\",\"PRDSTT_Show\":\"募集期\",\"TIMEPOINTASSETSCTL\":\"\",\"PRDSTAGE\":\"\",\"BILLFLAG\":\"0\",\"SECRESENDTIME\":\"000000\",\"FSTRESSTARTTIME\":\"000000\",\"GUESTRATIO\":\"0.00000\",\"TAFLAG\":\"1\",\"LATENAVDATE\":\"\",\"MINHOLDTERM\":\"15\",\"AUTOINVESTFLAG\":\"0\",\"CLOSETIMEBYE\":\"0\",\"TOTUSEAMT\":\"4668222467.12\",\"LASTMONSNAVDATE\":\"0\",\"FSTRESSTARTDATE\":\"0\",\"JZHBINCOM\":\"3.900-4.700%\",\"SECRESENDDATE\":\"0\",\"OPENDAY\":\"21\",\"SHARECLASS\":\"0\",\"PRDSTT\":\"1\",\"LASTMONSRATE\":\"0.000000000000\",\"TANAME\":\"信银理财有限责任公司\",\"LASTMONSNAV\":\"0.000000000000\",\"LOCKDAYS\":\"0\",\"PRDTYPE\":\"1\",\"ISYUEDONGPRD\":\"0\",\"transClients\":\"bcde01245\",\"FINCPRDBAL\":\"4668222467.12\",\"AREANO\":\"\",\"CURRENTHACAPITALGT\":\"0.00\",\"VALUE\":\"\",\"SECRESSTARTTIME\":\"000000\",\"INCOMEFLAG\":\"\",\"ISOPENDAY\":\"N\",\"PRDSTYLE\":\"\",\"FSTRESENDTIME\":\"000000\",\"INDESCRIPTION\":\"业绩比较基准\",\"CURRTYPE\":\"001\",\"ISSHORTTERM\":\"0\",\"INVESTCYC\":\"0\",\"PLEDGEFLAG\":\"0\",\"BOOKBUYDAYS\":\"7\",\"LATENAV\":\"\",\"AUTOINVESTDATE\":\"20221206\",\"LIMITFLAG\":\"1\",\"UNIT\":\"0.00\",\"FSTRESENDDATE\":\"0\",\"PREVAUMASSETGT\":\"0.00\",\"SNDFLAG\":\"0\",\"FINCTAGJSONSTR\":\"null\",\"INCOMEUNIT\":\"\",\"OPENPERIODFLAG\":\"0\",\"RECOMMENDFLAG\":\"1000000000\",\"CLOSETIME\":\"153000\",\"LASTINCOMERATE\":\"0.000000000000\",\"RESFLAG\":\"0\",\"AVAILIMIT\":\"\",\"OPENPERIODDAY\":\"360\",\"PRINCIPALFLAG\":\"0\",\"CALACCORD\":\"产品重点投资于信用债、非标等资产,并结合一定的杠杆操作和交易策略对组合收益进行增厚。根据当前市场利率水平、组合目标久期、可投资债券的静态收益率、债券杠杆操作等因素作为测算依据,扣除相关税费成本后,综合得出产品的业绩基准。\",\"RESAMT\":\"\",\"LASTMONS\":\"-1\",\"BOOKSELLDATE\":\"20240221\",\"CURRTYPE_Show\":\"人民币\",\"PRDNAME\":\"安盈象固收稳健一年定开26号A\",\"PRDATTR\":\"0\",\"TACODE\":\"YZX\",\"OPENPERIOD\":\"12\",\"ISVALID\":\"1\",\"PRDCODE\":\"AF222709A\",\"TURNNO\":\"\",\"TOTSELLLMS\":\"5000000000.00\",\"PASSINVESTORSCTL\":\"\",\"CHANNELS\":\"0137\",\"CLOSEDATE\":\"20991229\",\"NAVDATE\":\"20221201\",\"RISKLEVEL\":\"2\",\"NTMKTFLAG\":\"\",\"SECRESSTARTDATE\":\"0\",\"TRANSSTATUS\":\"100 00 0 0000000000000 000000 00000000 0000000000001000001100000000000000000000000000000000000000\",\"GUESTMAXRATIO\":\"\",\"TASHORTNAME\":\"信银理财\",\"GUESTMINRATIO\":\"\",\"ELECFLAG\":\"0\",\"RESERVED\":\"0\",\"CPFL\":\"5\",\"BOOKBUYFLAG\":\"1\",\"TRANSMODE\":\"0\",\"transClientsCN\":\"富裕客户、贵宾客户、私行客户、大众客户、个人普通客户、个人金卡客户、个人白金客户、个人钻石客户、黑金卡客户\",\"PSALEFLAG\":\"0\"},{\"RESDATE\":\"\",\"NAV\":\"1.0000\",\"IPOMODE\":\"0\",\"STARTAMT\":\"1.00\",\"EXTCHARGEFLAG\":\"0\",\"LVALDATE\":\"\",\"PRDDEADLINE\":\"0\",\"INSTFLAG\":\"0\",\"NVALDATE\":\"\",\"PRDSTTNM\":\"开放期\",\"MINHOLDTERMUNIT\":\"\",\"INCOMERATE\":\"0.024740\",\"EXPLAIN\":\"T日(国家工作日)17:00前发起申赎,T+1申购起息、T+1晚间赎回到账;单个客户限购600万\",\"IPOSTARTDATE\":\"20201026\",\"PURCHASEMODE\":\"1\",\"ISONLINESALE\":\"4\",\"RISKLEVEL_Show\":\"低风险\",\"BOOKBUYDATE\":\"0\",\"CITYCODE\":\"\",\"GUESTMIDRATIO\":\"\",\"AREACN\":\"\",\"IPOENDDATE\":\"20201026\",\"PRDSTT_Show\":\"开放期\",\"TIMEPOINTASSETSCTL\":\"\",\"PRDSTAGE\":\"\",\"BILLFLAG\":\"0\",\"SECRESENDTIME\":\"000000\",\"FSTRESSTARTTIME\":\"000000\",\"GUESTRATIO\":\"0.00000\",\"TAFLAG\":\"1\",\"LATENAVDATE\":\"\",\"MINHOLDTERM\":\"\",\"AUTOINVESTFLAG\":\"0\",\"CLOSETIMEBYE\":\"0\",\"TOTUSEAMT\":\"555985404.37\",\"LASTMONSNAVDATE\":\"20221103\",\"FSTRESSTARTDATE\":\"0\",\"JZHBINCOM\":\"\",\"SECRESENDDATE\":\"0\",\"OPENDAY\":\"0\",\"SHARECLASS\":\"0\",\"PRDSTT\":\"0\",\"LASTMONSRATE\":\"0.000000000000\",\"TANAME\":\"兴银理财有限责任公司\",\"LASTMONSNAV\":\"1.000000000000\",\"LOCKDAYS\":\"0\",\"PRDTYPE\":\"1\",\"ISYUEDONGPRD\":\"0\",\"transClients\":\"bcde01245\",\"FINCPRDBAL\":\"555985404.37\",\"AREANO\":\"\",\"CURRENTHACAPITALGT\":\"0.00\",\"VALUE\":\"\",\"SECRESSTARTTIME\":\"000000\",\"INCOMEFLAG\":\"\",\"ISOPENDAY\":\"N\",\"PRDSTYLE\":\"\",\"FSTRESENDTIME\":\"000000\",\"INDESCRIPTION\":\"\",\"CURRTYPE\":\"001\",\"ISSHORTTERM\":\"0\",\"INVESTCYC\":\"0\",\"PLEDGEFLAG\":\"0\",\"BOOKBUYDAYS\":\"0\",\"LATENAV\":\"\",\"AUTOINVESTDATE\":\"20201027\",\"LIMITFLAG\":\"1\",\"UNIT\":\"0.00\",\"FSTRESENDDATE\":\"0\",\"PREVAUMASSETGT\":\"0.00\",\"SNDFLAG\":\"0\",\"FINCTAGJSONSTR\":\"null\",\"INCOMEUNIT\":\"0.66120\",\"OPENPERIODFLAG\":\"2\",\"RECOMMENDFLAG\":\"1000000000\",\"CLOSETIME\":\"170000\",\"LASTINCOMERATE\":\"0.024740000000\",\"RESFLAG\":\"0\",\"AVAILIMIT\":\"\",\"OPENPERIODDAY\":\"1\",\"PRINCIPALFLAG\":\"0\",\"CALACCORD\":\"\",\"RESAMT\":\"\",\"LASTMONS\":\"1\",\"BOOKSELLDATE\":\"0\",\"CURRTYPE_Show\":\"人民币\",\"PRDNAME\":\"兴银添利宝(中信专属)\",\"PRDATTR\":\"1\",\"TACODE\":\"Y05\",\"OPENPERIOD\":\"1\",\"ISVALID\":\"1\",\"PRDCODE\":\"9B310015\",\"TURNNO\":\"\",\"TOTSELLLMS\":\"87741059011.25\",\"PASSINVESTORSCTL\":\"\",\"CHANNELS\":\"017\",\"CLOSEDATE\":\"20991230\",\"NAVDATE\":\"20221201\",\"RISKLEVEL\":\"1\",\"NTMKTFLAG\":\"\",\"SECRESSTARTDATE\":\"0\",\"TRANSSTATUS\":\"010 10 0 0000000000000 000000 00000000 0000000000001000001100000000000000000000000000000000000000\",\"GUESTMAXRATIO\":\"\",\"TASHORTNAME\":\"兴银理财\",\"GUESTMINRATIO\":\"\",\"ELECFLAG\":\"0\",\"RESERVED\":\"0\",\"CPFL\":\"5\",\"BOOKBUYFLAG\":\"0\",\"TRANSMODE\":\"0\",\"transClientsCN\":\"富裕客户、贵宾客户、私行客户、大众客户、个人普通客户、个人金卡客户、个人白金客户、个人钻石客户、黑金卡客户\",\"PSALEFLAG\":\"0\"},{\"RESDATE\":\"\",\"NAV\":\"1.0000\",\"IPOMODE\":\"0\",\"STARTAMT\":\"1000000.00\",\"EXTCHARGEFLAG\":\"0\",\"LVALDATE\":\"\",\"PRDDEADLINE\":\"0\",\"INSTFLAG\":\"0\",\"NVALDATE\":\"\",\"PRDSTTNM\":\"募集期\",\"MINHOLDTERMUNIT\":\"0\",\"INCOMERATE\":\"\",\"EXPLAIN\":\"\",\"IPOSTARTDATE\":\"20221129\",\"PURCHASEMODE\":\"1\",\"ISONLINESALE\":\"4\",\"RISKLEVEL_Show\":\"较低风险\",\"BOOKBUYDATE\":\"20221213\",\"CITYCODE\":\"\",\"GUESTMIDRATIO\":\"\",\"AREACN\":\"\",\"IPOENDDATE\":\"20221206\",\"PRDSTT_Show\":\"募集期\",\"TIMEPOINTASSETSCTL\":\"\",\"PRDSTAGE\":\"\",\"BILLFLAG\":\"0\",\"SECRESENDTIME\":\"000000\",\"FSTRESSTARTTIME\":\"000000\",\"GUESTRATIO\":\"0.00000\",\"TAFLAG\":\"1\",\"LATENAVDATE\":\"\",\"MINHOLDTERM\":\"7\",\"AUTOINVESTFLAG\":\"0\",\"CLOSETIMEBYE\":\"0\",\"TOTUSEAMT\":\"49984690000.00\",\"LASTMONSNAVDATE\":\"0\",\"FSTRESSTARTDATE\":\"0\",\"JZHBINCOM\":\"3.280-3.780%\",\"SECRESENDDATE\":\"0\",\"OPENDAY\":\"6\",\"SHARECLASS\":\"0\",\"PRDSTT\":\"1\",\"LASTMONSRATE\":\"0.000000000000\",\"TANAME\":\"信银理财有限责任公司\",\"LASTMONSNAV\":\"0.000000000000\",\"LOCKDAYS\":\"0\",\"PRDTYPE\":\"1\",\"ISYUEDONGPRD\":\"0\",\"transClients\":\"bcde01245\",\"FINCPRDBAL\":\"49984690000.00\",\"AREANO\":\"\",\"CURRENTHACAPITALGT\":\"0.00\",\"VALUE\":\"\",\"SECRESSTARTTIME\":\"000000\",\"INCOMEFLAG\":\"\",\"ISOPENDAY\":\"N\",\"PRDSTYLE\":\"\",\"FSTRESENDTIME\":\"000000\",\"INDESCRIPTION\":\"业绩比较基准\",\"CURRTYPE\":\"001\",\"ISSHORTTERM\":\"0\",\"INVESTCYC\":\"0\",\"PLEDGEFLAG\":\"0\",\"BOOKBUYDAYS\":\"14\",\"LATENAV\":\"\",\"AUTOINVESTDATE\":\"20221207\",\"LIMITFLAG\":\"1\",\"UNIT\":\"0.00\",\"FSTRESENDDATE\":\"0\",\"PREVAUMASSETGT\":\"0.00\",\"SNDFLAG\":\"0\",\"FINCTAGJSONSTR\":\"null\",\"INCOMEUNIT\":\"\",\"OPENPERIODFLAG\":\"0\",\"RECOMMENDFLAG\":\"1000000000\",\"CLOSETIME\":\"153000\",\"LASTINCOMERATE\":\"0.000000000000\",\"RESFLAG\":\"0\",\"AVAILIMIT\":\"\",\"OPENPERIODDAY\":\"180\",\"PRINCIPALFLAG\":\"0\",\"CALACCORD\":\"目前同盈象系列理财产品属性为固收类产品,底仓主要投资银行间短融中票、PPN、交易所非公开公司债等信用债品种和少量同业存单。根据当前市场利率水平、组合目标久期、可投资债券的静态收益率、债券杠杆操作等因素作为测算依据,扣除相关税费成本后,综合得出产品的业绩基准,该业绩比较基准不等于理财产品未来实际收益,不作为未来产品收益的业绩保证。\",\"RESAMT\":\"\",\"LASTMONS\":\"-1\",\"BOOKSELLDATE\":\"20230706\",\"CURRTYPE_Show\":\"人民币\",\"PRDNAME\":\"同盈象固收稳健半年定开45号D(私享2号)\",\"
                      PRDATTR\":\"0\",\"TACODE\":\"YZX\",\"OPENPERIOD\":\"6\",\"I
                      SVALID\":\"1\",\"PRDCODE\":\"AF222475D\",\"TURNNO\":\"\",\"TOTSELLL
                      MS\":\"50000000000.00\",\"PASSINVESTORSCTL\":\"\",\"CHANNELS\":\"0137\",\"CLOSED
                      ATE\":\"20991229\",\"NAVDATE\":\"20221201\",\"RISKLEVEL\":\"2\",\"NTMKTFLAG\":\"\",\"SECRESSTARTDATE\":\"0\",\"TRANSSTATUS\":\"100 00 0 0000000000000 000000 00000000 0000000000001000001100000000000000000000000000000000000000\",\"GUESTMAXRATIO\":\"\",\"TASHORTNAME\":\"信银理财\",\"GUESTMINRATIO\":\"\",\"ELECFLAG\":\"0\",\"RESERVED\":\"0\",\"CPFL\":\"5\",\"BOOKBUYFLAG\":\"1\",\"TRANSMODE\":\"0\",\"transClientsCN\":\"富裕客户、贵宾客户、私行客户、大众客户、个人普通客户、个人金卡客户、个人白金客户、个人钻石客户、黑金卡客户\",\"PSALEFLAG\":\"0\"},{\"RESDATE\":\"\",\"NAV\":\"1.0562\",\"IPOMODE\":\"0\",\"STARTAMT\":\"1.00\",\"EXTCHARGEFLAG\":\"0\",\"LVALDATE\":\"20220601\",\"PRDDEADLINE\":\"0\",\"INSTFLAG\":\"0\",\"NVALDATE\":\"20221130\",\"PRDSTTNM\":\"停止交易\",\"MINHOLDTERMUNIT\":\"0\",\"INCOMERATE\":\"\",\"EXPLAIN\":\"\",\"IPOSTARTDATE\":\"20210514\",\"PURCHASEMODE\":\"1\",\"ISONLINESALE\":\"4\",\"RISKLEVEL_Show\":\"较低风险\",\"BOOKBUYDATE\":\"20221205\",\"CITYCODE\":\"\",\"GUESTMIDRATIO\":\"\",\"AREACN\":\"\",\"IPOENDDATE\":\"20210517\",\"PRDSTT_Show\":\"停止交易\",\"TIMEPOINTASSETSCTL\":\"\",\"PRDSTAGE\":\"\",\"BILLFLAG\":\"0\",\"SECRESENDTIME\":\"000000\",\"FSTRESSTARTTIME\":\"000000\",\"GUESTRATIO\":\"0.00000\",\"TAFLAG\":\"1\",\"LATENAVDATE\":\"\",\"MINHOLDTERM\":\"6\",\"AUTOINVESTFLAG\":\"0\",\"CLOSETIMEBYE\":\"0\",\"TOTUSEAMT\":\"468627858.88\",\"LASTMONSNAVDATE\":\"20221102\",\"FSTRESSTARTDATE\":\"0\",\"JZHBINCOM\":\"2.987%\",\"SECRESENDDATE\":\"0\",\"OPENDAY\":\"5\",\"SHARECLASS\":\"0\",\"PRDSTT\":\"4\",\"LASTMONSRATE\":\"-0.003303000000\",\"TANAME\":\"信银理财有限责任公司\",\"LASTMONSNAV\":\"1.059700000000\",\"LOCKDAYS\":\"0\",\"PRDTYPE\":\"1\",\"ISYUEDONGPRD\":\"0\",\"transClients\":\"bcde01245\",\"FINCPRDBAL\":\"468627858.88\",\"AREANO\":\"\",\"CURRENTHACAPITALGT\":\"0.00\",\"VALUE\":\"1.05620000\",\"SECRESSTARTTIME\":\"000000\",\"INCOMEFLAG\":\"0\",\"ISOPENDAY\":\"N\",\"PRDSTYLE\":\"1\",\"FSTRESENDTIME\":\"000000\",\"INDESCRIPTION\":\"近6月年化收益率\",\"CURRTYPE\":\"001\",\"ISSHORTTERM\":\"0\",\"INVESTCYC\":\"0\",\"PLEDGEFLAG\":\"0\",\"BOOKBUYDAYS\":\"7\",\"LATENAV\":\"\",\"AUTOINVESTDATE\":\"20210519\",\"LIMITFLAG\":\"1\",\"UNIT\":\"0.00\",\"FSTRESENDDATE\":\"0\",\"PREVAUMASSETGT\":\"0.00\",\"SNDFLAG\":\"0\",\"FINCTAGJSONSTR\":\"null\",\"INCOMEUNIT\":\"\",\"OPENPERIODFLAG\":\"0\",\"RECOMMENDFLAG\":\"1000000000\",\"CLOSETIME\":\"153000\",\"LASTINCOMERATE\":\"0.074157851227\",\"RESFLAG\":\"0\",\"AVAILIMIT\":\"\",\"OPENPERIODDAY\":\"180\",\"PRINCIPALFLAG\":\"0\",\"CALACCORD\":\"目前同盈象系列理财产品属性为固收类产品,底仓主要投资银行间短融中票、PPN、交易所非公开公司债等信用债品种和少量同业存单。根据当前市场利率水平、组合目标久期、可投资债券的静态收益率、债券杠杆操作等因素作为测算依据,扣除相关税费成本后,综合得出产品的业绩基准\",\"RESAMT\":\"\",\"LASTMONS\":\"1\",\"BOOKSELLDATE\":\"20221205\",\"CURRTYPE_Show\":\"人民币\",\"PRDNAME\":\"同盈象固收稳健半年定开8号A\",\"PRDATTR\":\"0\",\"TACODE\":\"YZX\",\"OPENPERIOD\":\"6\",\"ISVALID\":\"1\",\"PRDCODE\":\"AF212005A\",\"TURNNO\":\"\",\"TOTSELLLMS\":\"1403000000.00\",\"PASSINVESTORSCTL\":\"\",\"CHANNELS\":\"0137\",\"CLOSEDATE\":\"20991229\",\"NAVDATE\":\"20221130\",\"RISKLEVEL\":\"2\",\"NTMKTFLAG\":\"\",\"SECRESSTARTDATE\":\"0\",\"TRANSSTATUS\":\"001 00 1 0000000000000 000000 00000000 0000000000000000001100000000000000000000000000000000000000\",\"GUESTMAXRATIO\":\"\",\"TASHORTNAME\":\"信银理财\",\"GUESTMINRATIO\":\"\",\"ELECFLAG\":\"0\",\"RESERVED\":\"0\",\"CPFL\":\"5\",\"BOOKBUYFLAG\":\"1\",\"TRANSMODE\":\"0\",\"transClientsCN\":\"富裕客户、贵宾客户、私行客户、大众客户、个人普通客户、个人金卡客户、个人白金客户、个人钻石客户、黑金卡客户\",\"PSALEFLAG\":\"0\"},{\"RESDATE\":\"\",\"NAV\":\"1.0000\",\"IPOMODE\":\"0\",\"STARTAMT\":\"3000000.00\",\"EXTCHARGEFLAG\":\"0\",\"LVALDATE\":\"\",\"PRDDEADLINE\":\"0\",\"INSTFLAG\":\"0\",\"NVALDATE\":\"\",\"PRDSTTNM\":\"开放期\",\"MINHOLDTERMUNIT\":\"\",\"INCOMERATE\":\"0.021780\",\"EXPLAIN\":\"\",\"IPOSTARTDATE\":\"20200717\",\"PURCHASEMODE\":\"1\",\"ISONLINESALE\":\"4\",\"RISKLEVEL_Show\":\"低风险\",\"BOOKBUYDATE\":\"0\",\"CITYCODE\":\"\",\"GUESTMIDRATIO\":\"\",\"AREACN\":\"\",\"IPOENDDATE\":\"20200803\",\"PRDSTT_Show\":\"开放期\",\"TIMEPOINTASSETSCTL\":\"\",\"PRDSTAGE\":\"\",\"BILLFLAG\":\"0\",\"SECRESENDTIME\":\"000000\",\"FSTRESSTARTTIME\":\"000000\",\"GUESTRATIO\":\"0.00000\",\"TAFLAG\":\"1\",\"LATENAVDATE\":\"\",\"MINHOLDTERM\":\"\",\"AUTOINVESTFLAG\":\"0\",\"CLOSETIMEBYE\":\"1\",\"TOTUSEAMT\":\"182440532975.00\",\"LASTMONSNAVDATE\":\"20221103\",\"FSTRESSTARTDATE\":\"0\",\"JZHBINCOM\":\"\",\"SECRESENDDATE\":\"0\",\"OPENDAY\":\"0\",\"SHARECLASS\":\"0\",\"PRDSTT\":\"0\",\"LASTMONSRATE\":\"0.000000000000\",\"TANAME\":\"信银理财有限责任公司\",\"LASTMONSNAV\":\"1.000000000000\",\"LOCKDAYS\":\"0\",\"PRDTYPE\":\"1\",\"ISYUEDONGPRD\":\"0\",\"transClients\":\"bcde01245\",\"FINCPRDBAL\":\"182440532975.00\",\"AREANO\":\"\",\"CURRENTHACAPITALGT\":\"0.00\",\"VALUE\":\"\",\"SECRESSTARTTIME\":\"000000\",\"INCOMEFLAG\":\"\",\"ISOPENDAY\":\"N\",\"PRDSTYLE\":\"\",\"FSTRESENDTIME\":\"000000\",\"INDESCRIPTION\":\"\",\"CURRTYPE\":\"001\",\"ISSHORTTERM\":\"0\",\"INVESTCYC\":\"0\",\"PLEDGEFLAG\":\"0\",\"BOOKBUYDAYS\":\"0\",\"LATENAV\":\"\",\"AUTOINVESTDATE\":\"20200804\",\"LIMITFLAG\":\"1\",\"UNIT\":\"0.00\",\"FSTRESENDDATE\":\"0\",\"PREVAUMASSETGT\":\"0.00\",\"SNDFLAG\":\"0\",\"FINCTAGJSONSTR\":\"null\",\"INCOMEUNIT\":\"0.59860\",\"OPENPERIODFLAG\":\"2\",\"RECOMMENDFLAG\":\"1000000000\",\"CLOSETIME\":\"153000\",\"LASTINCOMERATE\":\"0.021780000000\",\"RESFLAG\":\"0\",\"AVAILIMIT\":\"\",\"OPENPERIODDAY\":\"1\",\"PRINCIPALFLAG\":\"0\",\"CALACCORD\":\"\",\"RESAMT\":\"\",\"LASTMONS\":\"1\",\"BOOKSELLDATE\":\"0\",\"CURRTYPE_Show\":\"人民币\",\"PRDNAME\":\"慧赢天天智选1号\",\"PRDATTR\":\"1\",\"TACODE\":\"YZX\",\"OPENPERIOD\":\"1\",\"ISVALID\":\"1\",\"PRDCODE\":\"A204D2946\",\"TURNNO\":\"\",\"TOTSELLLMS\":\"2786950000000.00\",\"PASSINVESTORSCTL\":\"\",\"CHANNELS\":\"0137\",\"CLOSEDATE\":\"20991214\",\"NAVDATE\":\"20221201\",\"RISKLEVEL\":\"1\",\"NTMKTFLAG\":\"\",\"SECRESSTARTDATE\":\"0\",\"TRANSSTATUS\":\"010 11 0 0000111000000 000000 00000000 0000000000001000001100000000000000000000000000000000000000\",\"GUESTMAXRATIO\":\"\",\"TASHORTNAME\":\"信银理财\",\"GUESTMINRATIO\":\"\",\"ELECFLAG\":\"0\",\"RESERVED\":\"0\",\"CPFL\":\"5\",\"BOOKBUYFLAG\":\"0\",\"TRANSMODE\":\"0\",\"transClientsCN\":\"富裕客户、贵宾客户、私行客户、大众客户、个人普通客户、个人金卡客户、个人白金客户、个人钻石客户、黑金卡客户\",\"PSALEFLAG\":\"0\"},{\"RESDATE\":\"\",\"NAV\":\"1.0000\",\"IPOMODE\":\"0\",\"STARTAMT\":\"1.00\",\"EXTCHARGEFLAG\":\"0\",\"LVALDATE\":\"\",\"PRDDEADLINE\":\"112\",\"INSTFLAG\":\"0\",\"NVALDATE\":\"\",\"PRDSTTNM\":\"募集期\",\"MINHOLDTERMUNIT\":\"\",\"INCOMERATE\":\"\",\"EXPLAIN\":\"\",\"IPOSTARTDATE\":\"20221130\",\"PURCHASEMODE\":\"1\",\"ISONLINESALE\":\"4\",\"RISKLEVEL_Show\":\"较低风险\",\"BOOKBUYDATE\":\"0\",\"CITYCODE\":\"\",\"GUESTMIDRATIO\":\"\",\"AREACN\":\"\",\"IPOENDDATE\":\"20221205\",\"PRDSTT_Show\":\"募集期\",\"TIMEPOINTASSETSCTL\":\"\",\"PRDSTAGE\":\"\",\"BILLFLAG\":\"0\",\"SECRESENDTIME\":\"000000\",\"FSTRESSTARTTIME\":\"000000\",\"GUESTRATIO\":\"0.00000\",\"TAFLAG\":\"1\",\"LATENAVDATE\":\"\",\"MINHOLDTERM\":\"\",\"AUTOINVESTFLAG\":\"0\",\"CLOSETIMEBYE\":\"0\",\"TOTUSEAMT\":\"1998193945.00\",\"LASTMONSNAVDATE\":\"0\",\"FSTRESSTARTDATE\":\"0\",\"JZHBINCOM\":\"2.90%\",\"SECRESENDDATE\":\"0\",\"OPENDAY\":\"0\",\"SHARECLASS\":\"0\",\"PRDSTT\":\"1\",\"LASTMONSRATE\":\"0.000000000000\",\"TANAME\":\"华夏理财有限责任公司\",\"LASTMONSNAV\":\"0.000000000000\",\"LOCKDAYS\":\"0\",\"PRDTYPE\":\"1\",\"ISYUEDONGPRD\":\"0\",\"transClients\":\"bcde01245\",\"FINCPRDBAL\":\"1998193945.00\",\"AREANO\":\"\",\"CURRENTHACAPITALGT\":\"0.00\",\"VALUE\":\"\",\"SECRESSTARTTIME\":\"000000\",\"INCOMEFLAG\":\"\",\"ISOPENDAY\":\"N\",\"PRDSTYLE\":\"\",\"FSTRESENDTIME\":\"000000\",\"INDESCRIPTION\":\"业绩比较基准\",\"CURRTYPE\":\"001\",\"ISSHORTTERM\":\"0\",\"INVESTCYC\":\"0\",\"PLEDGEFLAG\":\"0\",\"BOOKBUYDAYS\":\"0\",\"LATENAV\":\"\",\"AUTOINVESTDATE\":\"20221206\",\"LIMITFLAG\":\"1\",\"UNIT\":\"0.00\",\"FSTRESENDDATE\":\"0\",\"PREVAUMASSETGT\":\"0.00\",\"SNDFLAG\":\"0\",\"FINCTAGJSONSTR\":\"null\",\"INCOMEUNIT\":\"\",\"OPENPERIODFLAG\":\"\",\"RECOMMENDFLAG\":\"1000000000\",\"CLOSETIME\":\"153000\",\"LASTINCOMERATE\":\"0.000000000000\",\"RESFLAG\":\"0\",\"AVAILIMIT\":\"\",\"OPENPERIODDAY\":\"0\",\"PRINCIPALFLAG\":\"0\",\"CALACCORD\":\"管理人以产品投资存款类资产仓位60%-80%,非标债权类资产仓位20%-40%,组合杠杆率100%为例,参考当前存款类资产收益水平、期限匹配的非标债权类资产目标收益率,结合产品投资策略并扣除各项费用后,综合测算得出上述业绩比较基准。测算示例仅供参考,具体资产投资比例可根据各类资产的收益水平、流动性特征、信用风险等因素动态调整。\",\"RESAMT\":\"\",\"LASTMONS\":\"-1\",\"BOOKSELLDATE\":\"0\",\"CURRTYPE_Show\":\"人民币\",\"PRDNAME\":\"(闲钱+)华夏理财固收债权封闭式26号112天\",\"PRDATTR\":\"0\",\"TACODE\":\"Y4\",\"OPENPERIOD\":\"0\",\"ISVALID\":\"1\",\"PRDCODE\":\"22121026A\",\"TURNNO\":\"\",\"TOTSELLLMS\":\"2000000000.00\",\"PASSINVESTORSCTL\":\"\",\"CHANNELS\":\"0137\",\"CLOSEDATE\":\"20230328\",\"NAVDATE\":\"20221201\",\"RISKLEVEL\":\"2\",\"NTMKTFLAG\":\"\",\"SECRESSTARTDATE\":\"0\",\"TRANSSTATUS\":\"100 00 0 0000000000000 000000 00000000 0000000000001000001100000000000000000000000000000000000000\",\"GUESTMAXRATIO\":\"\",\"TASHORTNAME\":\"华夏理财\",\"GUESTMINRATIO\":\"\",\"ELECFLAG\":\"0\",\"RESERVED\":\"0\",\"CPFL\":\"5\",\"BOOKBUYFLAG\":\"0\",\"TRANSMODE\
                          ":\"2\",\"transClientsCN\":\"富裕客户、贵宾客户、私行客户、大众客户、个人普通客户、个人金卡客户、个人白金客户、个人钻石客户、黑金卡客户\",\"PSALEFLAG\":\"0\"}],\"TOKENID\":\"\"}"""""), ensure_ascii=False)
---------------------------------------------------------------------------
JSONDecodeError                           Traceback (most recent call last)
<ipython-input-41-1b0456a6c5f3> in <module>
      5                       MS\":\"50000000000.00\",\"PASSINVESTORSCTL\":\"\",\"CHANNELS\":\"0137\",\"CLOSED
      6                       ATE\":\"20991229\",\"NAVDATE\":\"20221201\",\"RISKLEVEL\":\"2\",\"NTMKTFLAG\":\"\",\"SECRESSTARTDATE\":\"0\",\"TRANSSTATUS\":\"100 00 0 0000000000000 000000 00000000 0000000000001000001100000000000000000000000000000000000000\",\"GUESTMAXRATIO\":\"\",\"TASHORTNAME\":\"信银理财\",\"GUESTMINRATIO\":\"\",\"ELECFLAG\":\"0\",\"RESERVED\":\"0\",\"CPFL\":\"5\",\"BOOKBUYFLAG\":\"1\",\"TRANSMODE\":\"0\",\"transClientsCN\":\"富裕客户、贵宾客户、私行客户、大众客户、个人普通客户、个人金卡客户、个人白金客户、个人钻石客户、黑金卡客户\",\"PSALEFLAG\":\"0\"},{\"RESDATE\":\"\",\"NAV\":\"1.0562\",\"IPOMODE\":\"0\",\"STARTAMT\":\"1.00\",\"EXTCHARGEFLAG\":\"0\",\"LVALDATE\":\"20220601\",\"PRDDEADLINE\":\"0\",\"INSTFLAG\":\"0\",\"NVALDATE\":\"20221130\",\"PRDSTTNM\":\"停止交易\",\"MINHOLDTERMUNIT\":\"0\",\"INCOMERATE\":\"\",\"EXPLAIN\":\"\",\"IPOSTARTDATE\":\"20210514\",\"PURCHASEMODE\":\"1\",\"ISONLINESALE\":\"4\",\"RISKLEVEL_Show\":\"较低风险\",\"BOOKBUYDATE\":\"20221205\",\"CITYCODE\":\"\",\"GUESTMIDRATIO\":\"\",\"AREACN\":\"\",\"IPOENDDATE\":\"20210517\",\"PRDSTT_Show\":\"停止交易\",\"TIMEPOINTASSETSCTL\":\"\",\"PRDSTAGE\":\"\",\"BILLFLAG\":\"0\",\"SECRESENDTIME\":\"000000\",\"FSTRESSTARTTIME\":\"000000\",\"GUESTRATIO\":\"0.00000\",\"TAFLAG\":\"1\",\"LATENAVDATE\":\"\",\"MINHOLDTERM\":\"6\",\"AUTOINVESTFLAG\":\"0\",\"CLOSETIMEBYE\":\"0\",\"TOTUSEAMT\":\"468627858.88\",\"LASTMONSNAVDATE\":\"20221102\",\"FSTRESSTARTDATE\":\"0\",\"JZHBINCOM\":\"2.987%\",\"SECRESENDDATE\":\"0\",\"OPENDAY\":\"5\",\"SHARECLASS\":\"0\",\"PRDSTT\":\"4\",\"LASTMONSRATE\":\"-0.003303000000\",\"TANAME\":\"信银理财有限责任公司\",\"LASTMONSNAV\":\"1.059700000000\",\"LOCKDAYS\":\"0\",\"PRDTYPE\":\"1\",\"ISYUEDONGPRD\":\"0\",\"transClients\":\"bcde01245\",\"FINCPRDBAL\":\"468627858.88\",\"AREANO\":\"\",\"CURRENTHACAPITALGT\":\"0.00\",\"VALUE\":\"1.05620000\",\"SECRESSTARTTIME\":\"000000\",\"INCOMEFLAG\":\"0\",\"ISOPENDAY\":\"N\",\"PRDSTYLE\":\"1\",\"FSTRESENDTIME\":\"000000\",\"INDESCRIPTION\":\"近6月年化收益率\",\"CURRTYPE\":\"001\",\"ISSHORTTERM\":\"0\",\"INVESTCYC\":\"0\",\"PLEDGEFLAG\":\"0\",\"BOOKBUYDAYS\":\"7\",\"LATENAV\":\"\",\"AUTOINVESTDATE\":\"20210519\",\"LIMITFLAG\":\"1\",\"UNIT\":\"0.00\",\"FSTRESENDDATE\":\"0\",\"PREVAUMASSETGT\":\"0.00\",\"SNDFLAG\":\"0\",\"FINCTAGJSONSTR\":\"null\",\"INCOMEUNIT\":\"\",\"OPENPERIODFLAG\":\"0\",\"RECOMMENDFLAG\":\"1000000000\",\"CLOSETIME\":\"153000\",\"LASTINCOMERATE\":\"0.074157851227\",\"RESFLAG\":\"0\",\"AVAILIMIT\":\"\",\"OPENPERIODDAY\":\"180\",\"PRINCIPALFLAG\":\"0\",\"CALACCORD\":\"目前同盈象系列理财产品属性为固收类产品,底仓主要投资银行间短融中票、PPN、交易所非公开公司债等信用债品种和少量同业存单。根据当前市场利率水平、组合目标久期、可投资债券的静态收益率、债券杠杆操作等因素作为测算依据,扣除相关税费成本后,综合得出产品的业绩基准\",\"RESAMT\":\"\",\"LASTMONS\":\"1\",\"BOOKSELLDATE\":\"20221205\",\"CURRTYPE_Show\":\"人民币\",\"PRDNAME\":\"同盈象固收稳健半年定开8号A\",\"PRDATTR\":\"0\",\"TACODE\":\"YZX\",\"OPENPERIOD\":\"6\",\"ISVALID\":\"1\",\"PRDCODE\":\"AF212005A\",\"TURNNO\":\"\",\"TOTSELLLMS\":\"1403000000.00\",\"PASSINVESTORSCTL\":\"\",\"CHANNELS\":\"0137\",\"CLOSEDATE\":\"20991229\",\"NAVDATE\":\"20221130\",\"RISKLEVEL\":\"2\",\"NTMKTFLAG\":\"\",\"SECRESSTARTDATE\":\"0\",\"TRANSSTATUS\":\"001 00 1 0000000000000 000000 00000000 0000000000000000001100000000000000000000000000000000000000\",\"GUESTMAXRATIO\":\"\",\"TASHORTNAME\":\"信银理财\",\"GUESTMINRATIO\":\"\",\"ELECFLAG\":\"0\",\"RESERVED\":\"0\",\"CPFL\":\"5\",\"BOOKBUYFLAG\":\"1\",\"TRANSMODE\":\"0\",\"transClientsCN\":\"富裕客户、贵宾客户、私行客户、大众客户、个人普通客户、个人金卡客户、个人白金客户、个人钻石客户、黑金卡客户\",\"PSALEFLAG\":\"0\"},{\"RESDATE\":\"\",\"NAV\":\"1.0000\",\"IPOMODE\":\"0\",\"STARTAMT\":\"3000000.00\",\"EXTCHARGEFLAG\":\"0\",\"LVALDATE\":\"\",\"PRDDEADLINE\":\"0\",\"INSTFLAG\":\"0\",\"NVALDATE\":\"\",\"PRDSTTNM\":\"开放期\",\"MINHOLDTERMUNIT\":\"\",\"INCOMERATE\":\"0.021780\",\"EXPLAIN\":\"\",\"IPOSTARTDATE\":\"20200717\",\"PURCHASEMODE\":\"1\",\"ISONLINESALE\":\"4\",\"RISKLEVEL_Show\":\"低风险\",\"BOOKBUYDATE\":\"0\",\"CITYCODE\":\"\",\"GUESTMIDRATIO\":\"\",\"AREACN\":\"\",\"IPOENDDATE\":\"20200803\",\"PRDSTT_Show\":\"开放期\",\"TIMEPOINTASSETSCTL\":\"\",\"PRDSTAGE\":\"\",\"BILLFLAG\":\"0\",\"SECRESENDTIME\":\"000000\",\"FSTRESSTARTTIME\":\"000000\",\"GUESTRATIO\":\"0.00000\",\"TAFLAG\":\"1\",\"LATENAVDATE\":\"\",\"MINHOLDTERM\":\"\",\"AUTOINVESTFLAG\":\"0\",\"CLOSETIMEBYE\":\"1\",\"TOTUSEAMT\":\"182440532975.00\",\"LASTMONSNAVDATE\":\"20221103\",\"FSTRESSTARTDATE\":\"0\",\"JZHBINCOM\":\"\",\"SECRESENDDATE\":\"0\",\"OPENDAY\":\"0\",\"SHARECLASS\":\"0\",\"PRDSTT\":\"0\",\"LASTMONSRATE\":\"0.000000000000\",\"TANAME\":\"信银理财有限责任公司\",\"LASTMONSNAV\":\"1.000000000000\",\"LOCKDAYS\":\"0\",\"PRDTYPE\":\"1\",\"ISYUEDONGPRD\":\"0\",\"transClients\":\"bcde01245\",\"FINCPRDBAL\":\"182440532975.00\",\"AREANO\":\"\",\"CURRENTHACAPITALGT\":\"0.00\",\"VALUE\":\"\",\"SECRESSTARTTIME\":\"000000\",\"INCOMEFLAG\":\"\",\"ISOPENDAY\":\"N\",\"PRDSTYLE\":\"\",\"FSTRESENDTIME\":\"000000\",\"INDESCRIPTION\":\"\",\"CURRTYPE\":\"001\",\"ISSHORTTERM\":\"0\",\"INVESTCYC\":\"0\",\"PLEDGEFLAG\":\"0\",\"BOOKBUYDAYS\":\"0\",\"LATENAV\":\"\",\"AUTOINVESTDATE\":\"20200804\",\"LIMITFLAG\":\"1\",\"UNIT\":\"0.00\",\"FSTRESENDDATE\":\"0\",\"PREVAUMASSETGT\":\"0.00\",\"SNDFLAG\":\"0\",\"FINCTAGJSONSTR\":\"null\",\"INCOMEUNIT\":\"0.59860\",\"OPENPERIODFLAG\":\"2\",\"RECOMMENDFLAG\":\"1000000000\",\"CLOSETIME\":\"153000\",\"LASTINCOMERATE\":\"0.021780000000\",\"RESFLAG\":\"0\",\"AVAILIMIT\":\"\",\"OPENPERIODDAY\":\"1\",\"PRINCIPALFLAG\":\"0\",\"CALACCORD\":\"\",\"RESAMT\":\"\",\"LASTMONS\":\"1\",\"BOOKSELLDATE\":\"0\",\"CURRTYPE_Show\":\"人民币\",\"PRDNAME\":\"慧赢天天智选1号\",\"PRDATTR\":\"1\",\"TACODE\":\"YZX\",\"OPENPERIOD\":\"1\",\"ISVALID\":\"1\",\"PRDCODE\":\"A204D2946\",\"TURNNO\":\"\",\"TOTSELLLMS\":\"2786950000000.00\",\"PASSINVESTORSCTL\":\"\",\"CHANNELS\":\"0137\",\"CLOSEDATE\":\"20991214\",\"NAVDATE\":\"20221201\",\"RISKLEVEL\":\"1\",\"NTMKTFLAG\":\"\",\"SECRESSTARTDATE\":\"0\",\"TRANSSTATUS\":\"010 11 0 0000111000000 000000 00000000 0000000000001000001100000000000000000000000000000000000000\",\"GUESTMAXRATIO\":\"\",\"TASHORTNAME\":\"信银理财\",\"GUESTMINRATIO\":\"\",\"ELECFLAG\":\"0\",\"RESERVED\":\"0\",\"CPFL\":\"5\",\"BOOKBUYFLAG\":\"0\",\"TRANSMODE\":\"0\",\"transClientsCN\":\"富裕客户、贵宾客户、私行客户、大众客户、个人普通客户、个人金卡客户、个人白金客户、个人钻石客户、黑金卡客户\",\"PSALEFLAG\":\"0\"},{\"RESDATE\":\"\",\"NAV\":\"1.0000\",\"IPOMODE\":\"0\",\"STARTAMT\":\"1.00\",\"EXTCHARGEFLAG\":\"0\",\"LVALDATE\":\"\",\"PRDDEADLINE\":\"112\",\"INSTFLAG\":\"0\",\"NVALDATE\":\"\",\"PRDSTTNM\":\"募集期\",\"MINHOLDTERMUNIT\":\"\",\"INCOMERATE\":\"\",\"EXPLAIN\":\"\",\"IPOSTARTDATE\":\"20221130\",\"PURCHASEMODE\":\"1\",\"ISONLINESALE\":\"4\",\"RISKLEVEL_Show\":\"较低风险\",\"BOOKBUYDATE\":\"0\",\"CITYCODE\":\"\",\"GUESTMIDRATIO\":\"\",\"AREACN\":\"\",\"IPOENDDATE\":\"20221205\",\"PRDSTT_Show\":\"募集期\",\"TIMEPOINTASSETSCTL\":\"\",\"PRDSTAGE\":\"\",\"BILLFLAG\":\"0\",\"SECRESENDTIME\":\"000000\",\"FSTRESSTARTTIME\":\"000000\",\"GUESTRATIO\":\"0.00000\",\"TAFLAG\":\"1\",\"LATENAVDATE\":\"\",\"MINHOLDTERM\":\"\",\"AUTOINVESTFLAG\":\"0\",\"CLOSETIMEBYE\":\"0\",\"TOTUSEAMT\":\"1998193945.00\",\"LASTMONSNAVDATE\":\"0\",\"FSTRESSTARTDATE\":\"0\",\"JZHBINCOM\":\"2.90%\",\"SECRESENDDATE\":\"0\",\"OPENDAY\":\"0\",\"SHARECLASS\":\"0\",\"PRDSTT\":\"1\",\"LASTMONSRATE\":\"0.000000000000\",\"TANAME\":\"华夏理财有限责任公司\",\"LASTMONSNAV\":\"0.000000000000\",\"LOCKDAYS\":\"0\",\"PRDTYPE\":\"1\",\"ISYUEDONGPRD\":\"0\",\"transClients\":\"bcde01245\",\"FINCPRDBAL\":\"1998193945.00\",\"AREANO\":\"\",\"CURRENTHACAPITALGT\":\"0.00\",\"VALUE\":\"\",\"SECRESSTARTTIME\":\"000000\",\"INCOMEFLAG\":\"\",\"ISOPENDAY\":\"N\",\"PRDSTYLE\":\"\",\"FSTRESENDTIME\":\"000000\",\"INDESCRIPTION\":\"业绩比较基准\",\"CURRTYPE\":\"001\",\"ISSHORTTERM\":\"0\",\"INVESTCYC\":\"0\",\"PLEDGEFLAG\":\"0\",\"BOOKBUYDAYS\":\"0\",\"LATENAV\":\"\",\"AUTOINVESTDATE\":\"20221206\",\"LIMITFLAG\":\"1\",\"UNIT\":\"0.00\",\"FSTRESENDDATE\":\"0\",\"PREVAUMASSETGT\":\"0.00\",\"SNDFLAG\":\"0\",\"FINCTAGJSONSTR\":\"null\",\"INCOMEUNIT\":\"\",\"OPENPERIODFLAG\":\"\",\"RECOMMENDFLAG\":\"1000000000\",\"CLOSETIME\":\"153000\",\"LASTINCOMERATE\":\"0.000000000000\",\"RESFLAG\":\"0\",\"AVAILIMIT\":\"\",\"OPENPERIODDAY\":\"0\",\"PRINCIPALFLAG\":\"0\",\"CALACCORD\":\"管理人以产品投资存款类资产仓位60%-80%,非标债权类资产仓位20%-40%,组合杠杆率100%为例,参考当前存款类资产收益水平、期限匹配的非标债权类资产目标收益率,结合产品投资策略并扣除各项费用后,综合测算得出上述业绩比较基准。测算示例仅供参考,具体资产投资比例可根据各类资产的收益水平、流动性特征、信用风险等因素动态调整。\",\"RESAMT\":\"\",\"LASTMONS\":\"-1\",\"BOOKSELLDATE\":\"0\",\"CURRTYPE_Show\":\"人民币\",\"PRDNAME\":\"(闲钱+)华夏理财固收债权封闭式26号112天\",\"PRDATTR\":\"0\",\"TACODE\":\"Y4\",\"OPENPERIOD\":\"0\",\"ISVALID\":\"1\",\"PRDCODE\":\"22121026A\",\"TURNNO\":\"\",\"TOTSELLLMS\":\"2000000000.00\",\"PASSINVESTORSCTL\":\"\",\"CHANNELS\":\"0137\",\"CLOSEDATE\":\"20230328\",\"NAVDATE\":\"20221201\",\"RISKLEVEL\":\"2\",\"NTMKTFLAG\":\"\",\"SECRESSTARTDATE\":\"0\",\"TRANSSTATUS\":\"100 00 0 0000000000000 000000 00000000 0000000000001000001100000000000000000000000000000000000000\",\"GUESTMAXRATIO\":\"\",\"TASHORTNAME\":\"华夏理财\",\"GUESTMINRATIO\":\"\",\"ELECFLAG\":\"0\",\"RESERVED\":\"0\",\"CPFL\":\"5\",\"BOOKBUYFLAG\":\"0\",\"TRANSMODE\
----> 7                           ":\"2\",\"transClientsCN\":\"富裕客户、贵宾客户、私行客户、大众客户、个人普通客户、个人金卡客户、个人白金客户、个人钻石客户、黑金卡客户\",\"PSALEFLAG\":\"0\"}],\"TOKENID\":\"\"}"""""), ensure_ascii=False)

d:\Users\Administrator\anaconda3\envs\python3.6\lib\json\__init__.py in loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
    352             parse_int is None and parse_float is None and
    353             parse_constant is None and object_pairs_hook is None and not kw):
--> 354         return _default_decoder.decode(s)
    355     if cls is None:
    356         cls = JSONDecoder

d:\Users\Administrator\anaconda3\envs\python3.6\lib\json\decoder.py in decode(self, s, _w)
    337 
    338         """
--> 339         obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    340         end = _w(s, end).end()
    341         if end != len(s):

d:\Users\Administrator\anaconda3\envs\python3.6\lib\json\decoder.py in raw_decode(self, s, idx)
    353         """
    354         try:
--> 355             obj, end = self.scan_once(s, idx)
    356         except StopIteration as err:
    357             raise JSONDecodeError("Expecting value", s, err.value) from None

JSONDecodeError: Invalid control character at: line 2 column 8193 (char 16535)

2.11.1 field_info¶

field_info {
    u2             access_flags;
    u2             name_index;
    u2             descriptor_index;
    u2             attributes_count;
    attribute_info attributes[attributes_count];
}
2.11.1.1 access_flags¶
In [73]:
data = """
<table summary="Field access and property flags" border="1">
                              <colgroup>
                                 <col>
                                 <col>
                                 <col>
                              </colgroup>
                              <thead>
                                 <tr>
                                    <th>Flag Name</th>
                                    <th>Value</th>
                                    <th>Interpretation</th>
                                 </tr>
                              </thead>
                              <tbody>
                                 <tr>
                                    <td><code class="literal">ACC_PUBLIC</code></td>
                                    <td>0x0001</td>
                                    <td>Declared <code class="literal">public</code>; may be accessed from outside its
                                       		package.
                                    </td>
                                 </tr>
                                 <tr>
                                    <td><code class="literal">ACC_PRIVATE</code></td>
                                    <td>0x0002</td>
                                    <td>Declared <code class="literal">private</code>; usable only within the defining
                                       		class.
                                    </td>
                                 </tr>
                                 <tr>
                                    <td><code class="literal">ACC_PROTECTED</code></td>
                                    <td>0x0004</td>
                                    <td>Declared <code class="literal">protected</code>; may be accessed within
                                       		subclasses.
                                    </td>
                                 </tr>
                                 <tr>
                                    <td><code class="literal">ACC_STATIC</code></td>
                                    <td>0x0008</td>
                                    <td>Declared <code class="literal">static</code>.
                                    </td>
                                 </tr>
                                 <tr>
                                    <td><code class="literal">ACC_FINAL</code></td>
                                    <td>0x0010</td>
                                    <td>Declared <code class="literal">final</code>; never directly assigned to
                                       		after object construction (JLS §17.5).
                                    </td>
                                 </tr>
                                 <tr>
                                    <td><code class="literal">ACC_VOLATILE</code></td>
                                    <td>0x0040</td>
                                    <td>Declared <code class="literal">volatile</code>; cannot be cached.
                                    </td>
                                 </tr>
                                 <tr>
                                    <td><code class="literal">ACC_TRANSIENT</code></td>
                                    <td>0x0080</td>
                                    <td>Declared <code class="literal">transient</code>; not written or read by a
                                       		persistent object manager.
                                    </td>
                                 </tr>
                                 <tr>
                                    <td><code class="literal">ACC_SYNTHETIC</code></td>
                                    <td>0x1000</td>
                                    <td>Declared synthetic; not present in the source
                                       		code.
                                    </td>
                                 </tr>
                                 <tr>
                                    <td><code class="literal">ACC_ENUM</code></td>
                                    <td>0x4000</td>
                                    <td>Declared as an element of an <code class="literal">enum</code>.
                                    </td>
                                 </tr>
                              </tbody>
                           </table>
"""
In [74]:
parse_access_flags_from_html(data)
# pprint
pd.DataFrame(ALL_ACCESS_FLAGS, index=["Flag Name", "Value", "Interpretation"]).T
Out[74]:
Flag Name Value Interpretation
b'\x00\x01' ACC_PUBLIC 0x0001 Declared public; may be accessed from outside ...
b'\x00\x10' ACC_FINAL 0x0010 Declared final; never directly assigned to ...
b'\x00 ' ACC_SUPER 0x0020 Treat superclass methods specially when invoke...
b'\x02\x00' ACC_INTERFACE 0x0200 Is an interface, not a class.
b'\x04\x00' ACC_ABSTRACT 0x0400 Declared abstract; must not be ...
b'\x10\x00' ACC_SYNTHETIC 0x1000 Declared synthetic; not present in the source ...
b' \x00' ACC_ANNOTATION 0x2000 Declared as an annotation type.
b'@\x00' ACC_ENUM 0x4000 Declared as an element of an enum.
b'\x00\x02' ACC_PRIVATE 0x0002 Declared private; usable only within the defin...
b'\x00\x04' ACC_PROTECTED 0x0004 Declared protected; may be accessed within ...
b'\x00\x08' ACC_STATIC 0x0008 Declared static.
b'\x00@' ACC_VOLATILE 0x0040 Declared volatile; cannot be cached.
b'\x00\x80' ACC_TRANSIENT 0x0080 Declared transient; not written or read by a ...
In [75]:
def parse_attributes(resolver: Resolver, attributes_count: Union[int, tuple]) -> List[dict]:
    attributes_count = attributes_count[-1] if isinstance(attributes_count, tuple) else attributes_count
    return list(map(
        lambda ind: parse_attribute_info(resolver),
        range(attributes_count)
    ))
    
def parse_field_info(resolver: Resolver):
    field_info = {}
    def _do_access_flags():
        field_info['access_flags'] = resolver.next(2, RTEnum.bytes_)
        # bind 访问符数组
        acs_flags_ival = struct.unpack('>H', field_info['access_flags'][-1])[-1]
        field_info['access_flags_arr'] = parse_access_flags_arr(field_info['access_flags'])
    
    def _do_name_index():
        field_info["name_index"] = resolver.next(2, RTEnum.int_)
    
    def _do_descriptor_index():
        field_info["descriptor_index"] = resolver.next(2, RTEnum.int_)
        
    def _do_attributes_count():
        field_info["attributes_count"] = resolver.next(2, RTEnum.int_)
        
    def _do_attributes():
        field_info["attributes"] = parse_attributes(resolver, field_info["attributes_count"])
                
    _do_access_flags()
    _do_name_index()
    _do_descriptor_index()
    _do_attributes_count()
    _do_attributes()
    
    return field_info
    
    
In [76]:
resolver.fields = []
for _ in range(resolver.fields_count[-1]):
    resolver.fields.append(parse_field_info(resolver))
resolver.fields
Out[76]:
[{'access_flags': (315, b'\x00\x02'),
  'access_flags_arr': ['ACC_PUBLIC', 'ACC_SUPER'],
  'name_index': (317, 5),
  'descriptor_index': (319, 6),
  'attributes_count': (321, 2),
  'attributes': [{'attribute_name_index': (323, 7),
    'attribute_length': (325, 0),
    'info': (329, b'')},
   {'attribute_name_index': (329, 8),
    'attribute_length': (331, 6),
    'info': (335, b'\x00\x01\x00\t\x00\x00')}]}]
In [77]:
resolver.constant_pool[5:9]
Out[77]:
[{'tag': 'CONSTANT_Utf8_info',
  'length': (27, 3),
  'bytes[length]': (29, b'num')},
 {'tag': 'CONSTANT_Utf8_info', 'length': (33, 1), 'bytes[length]': (35, b'I')},
 {'tag': 'CONSTANT_Utf8_info',
  'length': (37, 10),
  'bytes[length]': (39, b'Deprecated')},
 {'tag': 'CONSTANT_Utf8_info',
  'length': (50, 25),
  'bytes[length]': (52, b'RuntimeVisibleAnnotations')}]

2.12 methods_count;¶

In [78]:
resolver.methods_count = resolver.next(2, RTEnum.int_)
resolver.methods_count
Out[78]:
(341, 2)

2.13 methods[methods_count];¶

In [79]:
def parse_methed_info(resolver: Resolver) -> dict:
    """
    method_info {
        u2             access_flags;
        u2             name_index;
        u2             descriptor_index;
        u2             attributes_count;
        attribute_info attributes[attributes_count];
    }
    """
    method_info = do_exp(resolver, parse_methed_info.__doc__)
    method_info["access_flags_arr"] = parse_access_flags_arr(method_info["access_flags"])
    method_info["attributes"] = parse_attributes(resolver, method_info["attributes_count"])
    return method_info
In [80]:
resolver.methods = []
for _ in range(resolver.methods_count[-1]):
    resolver.methods.append(parse_methed_info(resolver))
resolver.methods
Unknown exp:      method_info {
{'len': 'u2', 'key': 'access_flags'}
{'len': 'u2', 'key': 'name_index'}
{'len': 'u2', 'key': 'descriptor_index'}
{'len': 'u2', 'key': 'attributes_count'}
Unknown exp:          attribute_info attributes[attributes_count];
Unknown exp:      }
Unknown exp:      method_info {
{'len': 'u2', 'key': 'access_flags'}
{'len': 'u2', 'key': 'name_index'}
{'len': 'u2', 'key': 'descriptor_index'}
{'len': 'u2', 'key': 'attributes_count'}
Unknown exp:          attribute_info attributes[attributes_count];
Unknown exp:      }
Out[80]:
[{'access_flags': (343, 1),
  'name_index': (345, 10),
  'descriptor_index': (347, 11),
  'attributes_count': (349, 1),
  'access_flags_arr': ['ACC_PUBLIC'],
  'attributes': [{'attribute_name_index': (351, 12),
    'attribute_length': (353, 56),
    'info': (357,
     b'\x00\x02\x00\x01\x00\x00\x00\n*\xb7\x00\x01*\x04\xb5\x00\x02\xb1\x00\x00\x00\x02\x00\r\x00\x00\x00\n\x00\x02\x00\x00\x00\n\x00\x04\x00\x0b\x00\x0e\x00\x00\x00\x0c\x00\x01\x00\x00\x00\n\x00\x0f\x00\x10\x00\x00')}]},
 {'access_flags': (413, 1),
  'name_index': (415, 17),
  'descriptor_index': (417, 18),
  'attributes_count': (419, 1),
  'access_flags_arr': ['ACC_PUBLIC'],
  'attributes': [{'attribute_name_index': (421, 12),
    'attribute_length': (423, 65),
    'info': (427,
     b'\x00\x02\x00\x02\x00\x00\x00\t\x04<*\xb4\x00\x02\x1b`\xac\x00\x00\x00\x02\x00\r\x00\x00\x00\n\x00\x02\x00\x00\x00\x0f\x00\x02\x00\x10\x00\x0e\x00\x00\x00\x16\x00\x02\x00\x00\x00\t\x00\x0f\x00\x10\x00\x00\x00\x02\x00\x07\x00\x13\x00\x06\x00\x01')}]}]

2.14 attributes_count;¶

In [81]:
resolver.attributes_count = resolver.next(2, RTEnum.int_)
resolver.attributes_count
Out[81]:
(492, 1)

2.15 attributes[attributes_count];¶

In [82]:
resolver.attributes = parse_attributes(resolver, resolver.attributes_count)
resolver.attributes
Out[82]:
[{'attribute_name_index': (494, 20),
  'attribute_length': (496, 2),
  'info': (500, b'\x00\x15')}]

Format

C Type

Python type

Standard size

Notes

x

pad byte

no value

(7)

c

char

bytes of length 1

1

b

signed char

integer

1

(1), (2)

B

unsigned char

integer

1

(2)

?

_Bool

bool

1

(1)

h

short

integer

2

(2)

H

unsigned short

integer

2

(2)

i

int

integer

4

(2)

I

unsigned int

integer

4

(2)

l

long

integer

4

(2)

L

unsigned long

integer

4

(2)

q

long long

integer

8

(2)

Q

unsigned long long

integer

8

(2)

n

ssize_t

integer

(3)

N

size_t

integer

(3)

e

(6)

float

2

(4)

f

float

float

4

(4)

d

double

float

8

(4)

s

char[]

bytes

p

char[]

bytes

P

void*

integer

(5)

In [83]:
import struct
struct.unpack('>h', b'\x00\x34')
Out[83]:
(52,)