将Json字符串反序列化为复杂的Java Object

时间:2013-12-26 10:42:42

标签: java json deserialization gson

我有这样的对象结构:

class A {
    List<B> bees;
}

class B {
    String с;
}

我正在使用Gson解析器将此对象序列化为此字符串:

{"a":{"bees":[{"с":"text"}]}}

(添加根元素“a”)

API的格式有点不同:

{"a":{"bees":[{"b":{"с":"text"}}]}}

我需要能够正确地将这些字符串解析为A对象。

默认情况下,B对象(作为A的一部分)变为非空,但为空(所有字段均为空),这是可以理解的,因为解析器在其中找不到任何字段“b”(当它实际上是一个类时)名称)。

我正在寻找一个通用的解决方案,我有很多这样复杂的对象,我不想为每个对象实现很多自定义反序列化器。

Gson不是强制性的,如果有必要,我可以使用另一个lib。

感谢。

2 个答案:

答案 0 :(得分:1)

我更喜欢Jackson Tree Model和JDK 8 Stream来解析这样的json字符串,核心思想是将# Multi-threaded Mandelbrot Fractal (Do not run using IDLE!) # FB - 201104306 import threading from PIL import Image w = 512 # image width h = 512 # image height image = Image.new("RGB", (w, h)) wh = w * h maxIt = 256 # max number of iterations allowed # drawing region (xa < xb & ya < yb) xa = -2.0 xb = 1.0 ya = -1.5 yb = 1.5 xd = xb - xa yd = yb - ya numThr = 5 # number of threads to run # lock = threading.Lock() class ManFrThread(threading.Thread): def __init__ (self, k): self.k = k threading.Thread.__init__(self) def run(self): # each thread only calculates its own share of pixels for i in range(k, wh, numThr): kx = i % w ky = int(i / w) a = xa + xd * kx / (w - 1.0) b = ya + yd * ky / (h - 1.0) x = a y = b for kc in range(maxIt): x0 = x * x - y * y + a y = 2.0 * x * y + b x = x0 if x * x + y * y > 4: # various color palettes can be created here red = (kc % 8) * 32 green = (16 - kc % 16) * 16 blue = (kc % 16) * 16 # lock.acquire() global image image.putpixel((kx, ky), (red, green, blue)) # lock.release() break if __name__ == "__main__": tArr = [] for k in range(numThr): # create all threads tArr.append(ManFrThread(k)) for k in range(numThr): # start all threads tArr[k].start() for k in range(numThr): # wait until all threads finished tArr[k].join() image.save("MandelbrotFractal.png", "PNG") 数组元素bees映射到{"b":{"с":"text"}}的函数{{1} API。

{"с":"text"}

答案 1 :(得分:0)

如果您可以更改类结构,则更改类结构以匹配API的格式。例如,

class A {
    List<B> bees;
}

class B {
    MyTypeObjB B;
}
class MyTypeObjB {
    String c;
}

编辑根据评论,您还可以尝试通过在自定义类上实施deserialize界面来自定义JsonDeserializer方法。
您可以找到有关如何执行的详细信息,