Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我如何使用谷歌&x27;如何正确地反序列化JSON?_Java_Json_Api_Gson_Serialization - Fatal编程技术网

Java 我如何使用谷歌&x27;如何正确地反序列化JSON?

Java 我如何使用谷歌&x27;如何正确地反序列化JSON?,java,json,api,gson,serialization,Java,Json,Api,Gson,Serialization,简而言之,这是我想用JAVA解析的JSON对象的草图: { object1: { item1: //[String | Array | Object] , item2: // ... //<> more items object2: { /* .. */ } //<> more objects } (2) 嵌套对象的表示形式: public class JObject {

简而言之,这是我想用JAVA解析的JSON对象的草图:

{
    object1: {
            item1: //[String | Array | Object] ,
            item2: // ...
            //<> more items
    object2: { /* .. */ }
    //<> more objects
}
(2) 嵌套对象的表示形式:

 public class JObject {

    private String id ;
    private List<JNode> jObjects ;

    public JObject() { } 

    //get & set methods

}
每当我尝试访问可解析对象时(例如,通过
列表迭代器
),我都会得到一个
NullPointerException
。但是,Gson确实创建了I类指定的对象,并且不会引发任何后续错误

我知道这是以前做过的。那么,我错过了什么


这是不可能的。您需要修改JSON结构,将
object1
object2
等表示为数组的项。现在,它们是一个对象的属性,显然不知道其中有多少(否则,您没有尝试将其映射为
列表
)。Gson很聪明,但没那么聪明:)

因此,作为一个基本示例,此JSON结构包含一个数组:

{ nodes:
  [
    { item1: 'value1a', item2: 'value2a' },
    { item1: 'value1b', item2: 'value2b' },
    { item1: 'value1c', item2: 'value2c' }
  ]
}
结合Java表示(不一定称为POJO,而只是javabean或model对象或value对象)

应该有用

更新:需要明确的是,问题在于JSON结构,而不是Java对象结构。假设您的Java对象结构正是您希望得到的,那么您的JSON结构应该如下所示,以使Gson完成其工作:

{ jObjects:
  [
    { id: 123, jObjects: 
      [
        { item1: 'value1a', item2: 'value2a' },
        { item1: 'value1b', item2: 'value2b' },
        { item1: 'value1c', item2: 'value2c' }
        /* etc... commaseparated */
      ]
    },
    { id: 456, jObjects: 
      [
        { item1: 'value1d', item2: 'value2d' },
        { item1: 'value1e', item2: 'value2e' },
        { item1: 'value1f', item2: 'value2f' }
        /* etc... commaseparated */
      ]
    }
    /* etc... commaseparated */
  ]
}

只有
JsonElement
属性应该替换为
String
,因为它是无效的。

我认为BalusC为wrt GSon(通常是一对一的数据绑定)的特定问题提供了很好的指针;但是,如果你认为应该有更多的动态处理,你也可以考虑其他JSON处理包。许多软件包都有额外的或可供选择的映射方式:Json lib、flexjson和Jackson与Gson相比至少有额外的映射方式。有些提供了更松散的映射(您可以将事物的名称定义为类型),有些则实际支持多形类型(声明一个对象,但实际上可以映射到序列化的子类型)。

您好,谢谢您的回答!我打算维护标识符字符串(例如,
Object1
),以便能够正确解析容器类的内容,就像在JavaScript中一样。你知道怎么做吗?如果那些标识符字符串绑定到每个项目(
节点
),而不是容器(
节点
),那么你需要将其作为
节点
的属性。具有未知数量属性和未知属性名称的JS对象根本不是一个好主意/实践。你需要把它们放在一个数组中,并给数组一个固定的名称。这有点超出了使用JSON的目的。如果我不能在JAVA中镜像JSON的对象映射样式,我还可以编写自己的API我基本上是在保留标识符字符串的同时尝试做与此>中相同的事情。您链接的主题基本上显示和回答相同:使用数组属性。你的问题只是对基本OO原则的误解/误解,而不是JSON/Java。是的,我知道。您需要在JSON端将这些项分组到一个数组中,使用
[
]
东西来标识其开始和结束。只有这样,您才能在
列表中收集它们。再次检查我的答案和该主题中的代码示例。我想可能也有用。嗨,谢谢你的回答。实际上,我不太确定GSON内部是如何工作的,因此不太了解如何使用它。我现在使用Rhino的自定义解析,这在我看来更方便。Java不像JavaScript那样简单地支持嵌套数据对象,因此没有真正的理由不使用Rhino来实现这类功能。
 Gson gson = new Gson() ;
 JObjectContainer joc = gson.fromJson(jsonFile,JObjectContainer.class) ;
{ nodes:
  [
    { item1: 'value1a', item2: 'value2a' },
    { item1: 'value1b', item2: 'value2b' },
    { item1: 'value1c', item2: 'value2c' }
  ]
}
public class Container {
    private List<Node> nodes;
    // +getter.
}

public class Node {
    private String item1;
    private String item2;
    // +getters.
}
Container container = new Gson().fromJson(json, Container.class);
{ jObjects:
  [
    { id: 123, jObjects: 
      [
        { item1: 'value1a', item2: 'value2a' },
        { item1: 'value1b', item2: 'value2b' },
        { item1: 'value1c', item2: 'value2c' }
        /* etc... commaseparated */
      ]
    },
    { id: 456, jObjects: 
      [
        { item1: 'value1d', item2: 'value2d' },
        { item1: 'value1e', item2: 'value2e' },
        { item1: 'value1f', item2: 'value2f' }
        /* etc... commaseparated */
      ]
    }
    /* etc... commaseparated */
  ]
}